我用谷歌搜索了两天,但找不到任何描述以下问题的内容:
假设我在“www.example.com”上有以下表格:
<form action="formProcessor.htm" method="post">
<input name="field1" value="abc" />
<input name="field2" value="123" />
<input name="field3" value="etc" type="hidden" />
<input value="Submit" type="submit" />
</form>
我担心的是:如果有人创建一个模拟此表单的本地文件,手动填写所有值,然后将其提交到“www.example.com/formProcessor”怎么办?
问题 #1:有什么办法可以防止这种情况发生吗?
问题 #2:这是否被视为所谓的 CSRF?
我知道您可以尝试验证 REFERRER,但我也知道这很容易伪造(只需寻找“修改 header ”FF 附加组件)。
如果这是一个基本问题,请耐心等待我,我对网站安全还很陌生。
标记
最佳答案
是的,就是Cross-site Request Forgery .
您可以通过创建一次性 key 并将其存储在表单的隐藏输入元素中来防止它,如下所示:
<?php
$_SESSION['formkey'] = md5(rand() . time() . $_SERVER['REMOTE_ADDR']);
...
<input type="hidden" name="formkey" value="$_SESSION['formkey']" />
?>
在提交时,您检查提交的 key 是否与您存储在 session 中的 key 匹配。如果是,则处理该表单,否则拒绝该请求。
攻击者(或通过攻击者站点访问的无辜访问者)将不知道 key ,因此无法提交表单。
只有来自您网站的访问者(您在其中重新生成并在每个表单上设置了正确的 key )才能提交。
关于forms - 如何防止从本地主机向服务器提交表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8209719/