我在WordPress网站上有一个静态项目列表,当用户将鼠标悬停在每个项目上时,该网站使用Ajax +通过PHP查询WordPress数据库,在其他地方加载新数据。
在列表中,我已经使每个项目都有自己创建的nonce(使用wp_create_nonce())作为属性,以及所需的其他相关动态数据位(例如类别ID),因此最终的HTML看起来像这样:
<li data-nonce="abc" data-category-id="1">Option A</li>
<li data-nonce="def" data-category-id="2">Option B</li>
<li data-nonce="ghi" data-category-id="3">Option C</li>
然后在Javascript中,我做了这样的事情(当然缩短了):
on li hover {
var nonce = hoveredLi.attr('data-nonce'),
catid = hoveredLi.attr('data-category-id');
$.ajax({ type : "GET", data : { action: 'the_function', nonce: nonce, catid: catid }.....
然后在PHP中我通过确认现时启动ajax函数:
function the_function() {
if ( ! wp_verify_nonce( $_GET['nonce'], 'nonce' ) ) {
die();
}
$cat_id = isset( $_GET['catid '] ) && $_GET['catid '] ? intval($_GET['catid '] ) : 0;
$qry = new WP_Query( 'cat' => $cat_id, );
// rest of function ....
}
这是尝试使ajax调用安全的正确方法吗?或者是否需要更改nonce才能轻松看到(data-none属性)?
如果黑客试图使用开发者工具改变现时的数据,它总是会失败吗?
如果黑客试图通过类别ID属性注入恶意代码,那么使用Intval是尝试清理类别ID的最佳方法吗?类别总是整数,那么这是最有效的方法吗?
答案 0 :(得分:0)
您可以安全地在代码中公开nonces,每个用户都会获得不同的nonce(优秀的解释here)。一个随机数字总是被腌制,使黑客“复制nonce”变得“不可行”。 intval
会有效地消毒猫的输入。
答案 1 :(得分:0)
WordPress nonce仅用于防范CSRF。有人可以使用任意数量的方法修改nonce(隐藏它将毫无意义),但nonce是特定于用户的,因此它们只会使它无效。
除了验证nonce以确保用户实际执行了操作之外,还要确保您还验证用户是否具有在AJAX处理程序中执行操作的相应权限。 nonce不会验证用户是否有权执行操作,只是用户有意执行操作。
例如,如果您的AJAX处理程序允许用户编辑帖子,您可能希望执行类似的操作。
if ( ! current_user_can( 'edit_posts' ) || ! wp_verify_nonce( $_GET['nonce'], 'nonce' ) ) {
die();
}
至于你的其他问题,请务必使用intval
或(int)
将其转换为整数。
答案 2 :(得分:0)
在您的情景和&#34; recommended practice&#34;在场景中,DOM理论上可以由最终用户修改以表示未分配给它们的随机数。 (并且Wordpress会检查分配的用户。)测量的风险。
但是,您所做的与将nonce添加到隐藏字段的建议做法没有什么不同。如果用户可以以任何方式查看页面的当前HTML,那么它是可见的,所以我说你很安全。