非常清楚。
#1 楼
我以为check_admin_referer
检查了随机数(它确实调用了wp_verify_nonce
和引用网址。在深入研究了核心代码之后,我意识到它没有这样做。我认为这是我报告的错误,Ryan Boren回答了以下内容: 实际上,如果随机数有效,则不应检查引用者。
引用者的不可靠性是使用随机数的原因之一
。随机数替换完全检查引荐来源。我们唯一的一次检查引荐来源是在处理-1向后兼容性
条件时。-1表示某人未使用随机数,因此我们退回
进行引荐检查。现在,这种用法非常罕见。
check_admin_referer()几乎现在从不进行
引荐来源检查,因此命名不当,最好命名为
check_nonce()之类的东西,但我们将其保留为是为了适应旧时代的
。
所以实际上没有区别。
评论
很好的挖掘工作,谢谢,这带来了一些清晰度。
–杰夫
2012年5月16日在22:19
实际上,有一个很大的差异会影响使用率……如果随机数无效,则check_admin_referer使用die()杀死整个脚本,而wp_verify_nonce返回false。因此,如果在某些正常情况下随机数会失败,请使用wp_verify_nonce,以便脚本的其余部分仍然可以执行。
–第七钢
15年3月9日在18:41
@SeventhSteel-您当然正确。我对这个问题的解释是,正在比较检查随机数的逻辑,而不是当其无效时会发生什么
–斯蒂芬·哈里斯(Stephen Harris)
15年9月9日在18:58
#2 楼
没有!注意!!!如果没有正确的参数,不要指望
check_admin_referer()
!因为在某些情况下它可能不是die()
(与您的期望相反),而是仅返回false
响应。 浏览源代码逻辑的概述行为:
function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
$result = isset( $_REQUEST[ $query_arg ] ) ? wp_verify_nonce( $_REQUEST[ $query_arg ], $action ) : false;
//Now, "die() check"
if ( ! $result && ( -1 !== $action || strpos( wp_get_referer(), admin_url() ) !== 0 ) ) {
die();
}
return $result;
}
因此,您需要了解逻辑的作用。此处的故障:
A)如果仅调用不带参数的
check_admin_referrer()
:记住,它将使用自动内置的
_wpnonce
值(即是安全的,但在提交时仍要牢记该字段。)
您在不带参数的情况下调用它时,它使用默认的
-1
值进行操作,导致die() check
被跳过,功能不会die()
因此,您应该始终使用(在不带参数的情况下调用):随机数并使用参数进行调用:
if ( check_admin_referer() ) exit;
评论
风滚草徽章这个问题吗?真?有人吗?