创建一个nonce并将其作为数据属性输出是一个漏洞吗?

时间:2015-02-11 15:37:21

标签: javascript php jquery ajax wordpress

我在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的最佳方法吗?类别总是整数,那么这是最有效的方法吗?

3 个答案:

答案 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,那么它是可见的,所以我说你很安全。