我在不止一个网站上读过这种保护表格的方法:
我添加了一个隐藏字段:
<input type="hidden" name="token" value="<?php echo $token; ?>" />
令牌由以下人员生成:
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
我确实理解这段代码因其随机性而几乎牢不可破。
我不明白的是:为什么他们将令牌包含在隐藏的表单字段中,可以在html源代码中查看?
然后用户可以保存表单并将有效的md5令牌复制到表单的虚假版本并提交吗?
答案 0 :(得分:3)
这旨在阻止CSRF。
关键不是要阻止Alice访问Bob的网站,然后使用令牌做坏事。
这是为了阻止Charles的网站使用JavaScript让Alice的浏览器向Bob的网站提交表单并做坏事(使用Alice的凭据)。 (查尔斯不会在表格中提供令牌副本)。
答案 1 :(得分:0)
这是一项有助于防止Cross-Site Request Forgery的策略。令牌在HTML源中并不重要,因为它只使用一次。攻击者必须知道它是什么才能欺骗用户,即使这样,用户也必须先通过合法手段提出表单。
答案 2 :(得分:0)
当受害者访问恶意网站的准备好的网页时,此技术用于防止恶意网站代表受害者伪造真实和合法的Cross-Site Request Forgery attacks。由于受害者的浏览器将发送任何身份验证凭据以及伪造的请求,服务器无法区分该请求是否是受害者的意图。
一个简单的例子是导致浏览器发送GET请求的<img>
个元素,另一个例子是<form>
元素,它们是由JavaScript自动生成和发送的,可能导致POST请求。
为了缓解这种威胁,这个随机令牌被用作只为服务器和浏览器所知的秘密:服务器生成随机令牌,将其存储在会话中并在响应中将其发送给浏览器然后在后续请求中发回。这样做,恶意网站无法伪造合法请求,因为它不知道随机令牌并且无法获取它。