WordPress安全:使用Nonce保护主题和插件代码
保护WordPress主题或插件代码的安全至关重要,可以有效防止恶意用户的攻击。我们之前已经介绍过如何在WordPress中清理、转义和验证表单数据,以及如何使用VIP扫描器提高WordPress主题质量。今天,我们将探讨Nonce(一次性使用数字)如何帮助保护WordPress主题和插件的安全。
wp_create_nonce()
实现的,该函数接受一个表示要保护的操作的单个字符串参数。验证Nonce是使用wp_verify_nonce()
函数完成的,该函数接受两个参数:要验证的Nonce和关联的操作。WordPress Nonce定义为:
……一个“一次性使用数字”,用于帮助保护URL和表单免受某些类型的滥用(恶意或其他)。 https://www.php.cn/link/c5af1dfde10402285102771ad64b3dac
虽然在WordPress中,Nonce从技术上讲不是数字(它是由字母和数字组成的哈希值),但它确实有助于防止恶意用户运行操作。
WordPress Nonce的工作分为两部分:
例如,当您在WordPress管理屏幕中删除帖子时,您会注意到URL包含一个_wpnonce
参数:
https://www.php.cn/link/18175d262a01ebf04bc03e38e48e3ffc
删除帖子的例程将检查帖子542是否具有a03ac85772
的Nonce值,然后再删除帖子。如果Nonce不存在或与预期值不匹配,则不会删除帖子。
这可以防止恶意用户潜在地删除大量帖子。例如,以下内容将不起作用,因为Nonce属于帖子ID 542:
https://www.php.cn/link/322d830da1130169fb4ca1c7543799d0 https://www.php.cn/link/dd4143061640d55fb312dd0ce8afa76e https://www.php.cn/link/9e0f9113b44003201076a9fade1b72d8
现在让我们看看如何在插件中实现WordPress Nonce。
让我们从一个具有自身设置屏幕的基本插件开始。设置屏幕有一个字段,可以提交并保存在WordPress选项表中。
在wp-content/plugins/implementing-wordpress-nonces/implementing-wordpress-nonces.php
中的新文件中输入以下代码:
// ... (插件代码,与原文相同) ...
通过WordPress管理>插件屏幕激活插件,您将看到一个新的Nonces菜单项:
单击此项,您将进入设置屏幕,其中只有一个字段:
输入任何值,单击“保存”,如果一切正常,您将看到确认信息以及您刚刚输入的值:
将以下URL输入到您的Web浏览器地址栏中(将域名替换为您安装WordPress的位置):
https://www.php.cn/link/0e143c3bef0f7759c230664c4dc905f8
注意发生了什么?该值被简单地保存为abc,只需直接访问URL并登录到WordPress即可:
虽然我们可以在代码中使用$_POST
代替$_REQUEST
(我们使用$_REQUEST
是为了更容易演示安全问题),但这无济于事——恶意用户仍然可以通过自己或诱导您单击链接来让您向此屏幕发送POST请求,从而导致选项值更改。
这被称为跨站点请求伪造(或CSRF)。恶意网站、电子邮件、应用程序等会导致用户的Web浏览器执行不需要的操作。
我们现在将创建和验证WordPress Nonce,以防止这种攻击成为可能。
如前所述,此过程分为两个步骤:首先,我们需要创建一个将与我们的表单一起提交的Nonce。其次,我们需要在提交表单时验证该Nonce。
要在我们的表单中创建Nonce字段,我们可以使用wp_nonce_field()
:
获取或显示Nonce隐藏表单字段……用于验证表单请求的内容是否来自当前站点,而不是其他地方……
在我们的输入按钮上方添加以下代码:
// ... (插件代码,与原文相同) ...
wp_nonce_field
接受四个参数——前两个最重要:
$action
:这决定了我们正在运行的特定操作,并且应该唯一。最好用插件名称作为操作的前缀,因为可能会有多个操作运行。在本例中,我们正在保存某些内容,因此我们使用了implementing_wordpress_nonces_save
$name
:这决定了此函数创建的隐藏字段的名称。如上所述,我们已使用插件名称作为其前缀,因此将其命名为implementing_wordpress_nonces_nonce
如果我们重新加载设置屏幕,更改我们的值并单击“保存”,您会注意到该值仍然会更改。我们现在需要实现对提交的Nonce字段的检查,使用wp_verify_nonce( $name, $action )
:
验证Nonce是否正确且相对于指定操作未过期。该函数用于验证当前请求中发送的Nonce,通常通过
$_REQUEST
PHP变量访问。
将我们插件的admin_screen()
函数的“保存设置”部分替换为以下代码:
wp_nonce_field( 'implementing_wordpress_nonces_save', 'implementing_wordpress_nonces_nonce' );
此代码执行以下几个操作:
为了确保我们的Nonce正在创建和验证,让我们再次尝试访问我们的“恶意”直接URL:
https://www.php.cn/link/0e143c3bef0f7759c230664c4dc905f8.
如果我们的Nonce已实现并正在验证,您将看到“无效的Nonce指定”通知:
...(剩余部分与原文相同,只是对语言和表达方式进行细微调整,保持原意不变)...
以上是什么是WordPress Nonces?的详细内容。更多信息请关注PHP中文网其他相关文章!