WordPress nonce是由WordPress生成的一次性使用安全令牌,用于帮助保护URL和表单免受滥用。
如果你的主题允许用户提交数据,无论是在管理还是在前端,nonce可以用来验证用户是否打算执行操作,并有助于防止跨站请求伪造(CSRF)。
例如,WordPress网站允许授权用户上传视频。作为授权用户,上传视频是一种有意行为,是被允许的。然而,在CSRF中,黑客可以劫持(伪造)授权用户的使用并进行欺诈性提交。
由nonce生成的一次性使用的哈希值通过验证上传请求是否由当前登录用户完成,从而防止此类型的伪造攻击。nonce只对当前用户的会话是唯一的,所以如果尝试登录或退出,页面上的任何nonce都会失效。
创建 Nonce
- wp_nonce_url() – 向URL添加nonce
- wp_nonce_field() – 向表单添加nonce
- wp_create_nonce() – 以自定义方式使用nonce,用于处理AJAX请求
验证 Nonce
- check_admin_referer() – 验证在管理界面的URL或表单中传递的nonce
- check_ajax_referer() – 检查nonce(而不是来源),如果检查失败,默认情况下会终止脚本执行
- wp_verify_nonce() – 验证在其他情况下传递的nonce
示例
在这个例子中,我们有一个基本的提交表单。
创建 Nonce
要使用nonce保护表单,请使用wp_nonce_field()函数创建隐藏的nonce字段:
<form method="post"> <!-- some inputs here ... --> <?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?> </form>
验证 Nonce
在我们的示例中,我们首先检查nonce字段是否已设置,因为如果表单尚未提交,我们不希望运行任何操作。如果表单已经提交,我们使用nonce字段值函数。如果nonce验证成功,则将处理表单。
使用 wp_verify_nonce + wp_nonce_ays (你确定吗)
if ( ! isset( $_POST['name_of_nonce_field'] ) || ! wp_verify_nonce( $_POST['name_of_nonce_field'], 'name_of_my_action' ) ) { wp_nonce_ays( '' ); } // process form data
或使用 check_admin_referer
check_admin_referer( 'name_of_my_action', 'name_of_nonce_field' ); // process form data
在这些示例中,基本的nonce过程:
- 使用wp_nonce_field()函数生成nonce。
- nonce随表单提交一起提交。
- 使用wp_verify_nonce()或check_admin_referer()函数来验证nonce的有效性。如果没有通过验证,请求将退出,并显示默认错误消息(不要显示精确错误信息)。
相关链接:插件开发手册:Nonce