2011-11-21 59 views
3

我GOOGLE了这两天提交形式,我只是找不到任何描述了以下问题:如何防止从本地主机到服务器

比方说,我对“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,但我也知道这可以很容易伪造(只需查找“修改头文件”FF附加组件)。

如果这是一个基本问题,请耐心等待我,我对网站安全性相当陌生。

马克

回答

4

是的,这是Cross-site Request Forgery

你可以阻止它通过创建一个一次性密钥,并存储在一个隐藏的输入元素在你的形式是这样的:

<?php 

$_SESSION['formkey'] = md5(rand() . time() . $_SERVER['REMOTE_ADDR']); 

... 

<input type="hidden" name="formkey" value="$_SESSION['formkey']" /> 

?> 

而且一旦提交,您检查提交的关键字是否匹配你在会话中存储的一个。如果是这样,你处理表单,否则拒绝请求。

攻击者(或通过攻击者网站访问的无辜访问者)不会知道密钥,因此无法提交表单。

只有来自您网站的访问者可以在其中重新生成并在每个表单上设置正确的密钥,然后才能提交。

1

使用以下/表单页面上相似(PHP):

session_start(); 
if (empty($_SESSION['formkey'])) { 
$_SESSION['formkey'] = time() . "-" . getmypid() . "-" . rand(0, mt_getrandmax()); 
} 

设置您的形式隐藏的表单字段:

<input type="hidden" name="formkey" value="<?php echo $_SESSION['formkey']; ?>" /> 

,然后处理/处理器页:

if ($_SESSION['formkey'] !== $_POST['formkey']) { 
header("Location: formpage.php?blankfields"); 
exit(); 
} 

我试图从远程服务器发布,并按预期失败。 讨厌这些垃圾邮件发送者机器人,不知道他们试图通过垃圾邮件形式达到什么目的?

相关问题