Php 隐藏表单字段中的md5令牌

Php 隐藏表单字段中的md5令牌,php,forms,security,Php,Forms,Security,我在不止一个网站上看到了这种保护表单的方法: 我添加一个隐藏字段: <input type="hidden" name="token" value="<?php echo $token; ?>" /> 我知道这段代码实际上是不可破解的,因为它是随机的 我不明白的是:为什么他们在html源代码中可以查看的隐藏表单字段中包含令牌 然后,用户是否可以保存表单并将有效的md5令牌复制到表单的假版本并提交它?这是为了防止 重点不是阻止Alice访问Bob的网站,然后使用令牌做坏事

我在不止一个网站上看到了这种保护表单的方法:

我添加一个隐藏字段:

<input type="hidden" name="token" value="<?php echo $token; ?>" />
我知道这段代码实际上是不可破解的,因为它是随机的

我不明白的是:为什么他们在html源代码中可以查看的隐藏表单字段中包含令牌


然后,用户是否可以保存表单并将有效的md5令牌复制到表单的假版本并提交它?

这是为了防止

重点不是阻止Alice访问Bob的网站,然后使用令牌做坏事


这是为了阻止Charles的网站使用JavaScript让Alice的浏览器向Bob的网站提交表单并做坏事(使用Alice的凭据)。(Charles不会将代币副本放入表单中)。

这是一种有助于预防的策略。标记是否在HTML源代码中并不重要,因为它只使用一次。攻击者必须事先知道它是什么,才能欺骗用户,即使这样,用户也必须先通过合法手段提交表单。

此技术用于防止恶意网站在访问恶意网站的准备好的网页时,代表受害者伪造真实合法的表单。由于受害者的浏览器将随伪造的请求一起发送任何身份验证凭据,服务器无法区分该请求是否是受害者的意图

一个简单的例子是导致浏览器发送GET请求的
元素,另一个例子是由JavaScript自动生成和发送的
元素,可以导致POST请求


为了缓解此威胁,此随机令牌被用作只有服务器和浏览器才知道的秘密:服务器生成随机令牌,将其存储在会话中,并在响应中发送给浏览器,然后在后续请求中发回。这样做,恶意站点就无法伪造合法请求,因为它不知道随机令牌,也无法获取它。

好的,我喜欢它,我会将它标记为答案。但是,如何防止合法用户脱机使用表单并更改数据?你要确保他们尝试进行的任何更改都是他们授权进行的。我通过检查答案是否只包含数字(我处理的是产品ID)来做到这一点。但我想通过完全屏蔽假数据来获得额外的安全性。。我想那是不可能的!你宁愿用“Malory”来代表恶意的一方。
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;