我的WordPress网站(4.9.1)中有一个表单,其中包含一个nonce字段(带有wp_nonce_field())并发布到admin-post.php。
我以一种非常简单的方式使用它......:
<?php wp_nonce_field( $action, 'referer' ); ?>
......产生类似这样的东西:
<input type="hidden" id="referer" name="referer" value="d6dd8e58dd" />
<input type="hidden" name="_wp_http_referer" value="/slug/?laorder=99371&laid=92bbfca59e41a4938ce8c0751cfcd0c4a68e75c14bd94b981505cc037079280&lauser=myemail%domain.com" />
问题在于验证:
if (! isset( $_POST['referer'] ) || ! wp_verify_nonce( $_POST['referer'], $action ) )
在某些(未知)环境下失败:它似乎总是在以隐身模式发布时起作用,对于使用不同浏览器的某些用户(chrome,firefox或safari),它会随机失败。
所有用户都是来宾。
有人知道为什么会发生随机行为吗?
答案 0 :(得分:2)
正如您所说的所有用户都是来宾并且没有人登录但您不应该将nonce用于未登录的用户。您不应在任何完整或部分页面缓存方案中使用随机数。与多次给出的印象不同,只是在没有特定原因的情况下在这里和那里撒上nonce不会改善站点的安全性,并且可能会导致非登录用户出现实际问题。
因为WordPress会验证您的身份验证Cookie信息,如果您被允许删除该帖子将继续删除它。攻击者可以做的就是让你的浏览器在你不知情的情况下访问该网址。例如,通过在第三方页面上制作链接。例如:
{{1}}
在里面。这会触发您的浏览器向WordPress发出请求,浏览器会自动附加您的身份验证cookie,而WordPress会认为这是一个有效的请求。