创建随机数并将其输出为数据属性是否存在漏洞?
Is it a vulnerability to create a nonce and output it as a data-attribute?
我在 WordPress 网站上有一个静态项目列表,当用户将鼠标悬停在每个项目上时,该网站使用 Ajax 加载其他地方的新数据 + 通过 PHP 查询 WordPress 数据库。
在列表中,我让每个项目都有自己创建的随机数(使用 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 调用安全的正确方法吗?或者是否需要更改随机数(data-none 属性)?
如果黑客试图使用开发人员工具更改 nonce 中的数据,是否总是会失败?
如果黑客试图通过类别 ID 属性注入恶意代码,使用 Intval 是否是尝试清除类别 ID 的最佳方法?类别总是整数,那么这是最有效的方法吗?
您可以安全地在代码中公开随机数,每个用户都会获得不同的随机数(很好的解释here)。随机数总是被加盐,使其成为黑客的 "infeasible to duplicate the nonce"。 intval
将有效地清理 cat 输入。
一个WordPress nonce is just for protecting against CSRF。有人可以使用任意数量的方法修改随机数(隐藏它是没有意义的),但是随机数是特定于用户的,所以他们只会使它无效。
除了验证 nonce 以确保用户实际执行了该操作之外,还要确保您还验证了用户是否具有在 AJAX 处理程序中执行该操作的适当权限。随机数不会验证用户是否有权执行某项操作,只是验证用户是有意执行的。
例如,如果您的 AJAX 处理程序允许用户编辑 post,您可能会想做这样的事情。
if ( ! current_user_can( 'edit_posts' ) || ! wp_verify_nonce( $_GET['nonce'], 'nonce' ) ) {
die();
}
至于你的其他问题,当然,使用 intval
或 (int)
.
将其转换为整数
在您的场景和“recommended practice”场景中,DOM 理论上可以由最终用户修改以表示未分配给他们的随机数。 (并且 Wordpress 检查分配的用户。)测量的风险。
但是,您所做的与将随机数添加到隐藏字段的推荐做法没有什么不同。如果用户可以通过任何一种方式查看页面的当前 HTML,那么我会说你是安全的。
我在 WordPress 网站上有一个静态项目列表,当用户将鼠标悬停在每个项目上时,该网站使用 Ajax 加载其他地方的新数据 + 通过 PHP 查询 WordPress 数据库。
在列表中,我让每个项目都有自己创建的随机数(使用 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 调用安全的正确方法吗?或者是否需要更改随机数(data-none 属性)?
如果黑客试图使用开发人员工具更改 nonce 中的数据,是否总是会失败?
如果黑客试图通过类别 ID 属性注入恶意代码,使用 Intval 是否是尝试清除类别 ID 的最佳方法?类别总是整数,那么这是最有效的方法吗?
您可以安全地在代码中公开随机数,每个用户都会获得不同的随机数(很好的解释here)。随机数总是被加盐,使其成为黑客的 "infeasible to duplicate the nonce"。 intval
将有效地清理 cat 输入。
一个WordPress nonce is just for protecting against CSRF。有人可以使用任意数量的方法修改随机数(隐藏它是没有意义的),但是随机数是特定于用户的,所以他们只会使它无效。
除了验证 nonce 以确保用户实际执行了该操作之外,还要确保您还验证了用户是否具有在 AJAX 处理程序中执行该操作的适当权限。随机数不会验证用户是否有权执行某项操作,只是验证用户是有意执行的。
例如,如果您的 AJAX 处理程序允许用户编辑 post,您可能会想做这样的事情。
if ( ! current_user_can( 'edit_posts' ) || ! wp_verify_nonce( $_GET['nonce'], 'nonce' ) ) {
die();
}
至于你的其他问题,当然,使用 intval
或 (int)
.
在您的场景和“recommended practice”场景中,DOM 理论上可以由最终用户修改以表示未分配给他们的随机数。 (并且 Wordpress 检查分配的用户。)测量的风险。
但是,您所做的与将随机数添加到隐藏字段的推荐做法没有什么不同。如果用户可以通过任何一种方式查看页面的当前 HTML,那么我会说你是安全的。