如何防止他人将自己的数据发送到我的php页面?

时间:2014-02-24 14:43:25

标签: php html forms

假设我的网站上有一个注册页面,其中包含注册表格:

<form action="register.php" method="post">
<input name="...">
<input...>
...
<input type='submit'>
</form>

然后其他人创建了自己的页面并使用了我的表单的操作页面:

<form action="http://mywebsitename.com/register.php" method="post">

他可以通过这种方式将自己的数据发布到我的页面吗?如果是这样,我该如何防止这种情况?

编辑:似乎使用令牌并将其值存储在会话变量中并不会阻止某人从他自己的表单提交数据(即使每个页面请求都生成令牌)打开我的原始页面(这样就启动了他的会话,并生成了该会话的标记),然后在会话中使用该表单以自己的形式。
所以我认为昆汀是对的,无论如何必须在行动页面中验证数据才能被接受。

谢谢大家。

5 个答案:

答案 0 :(得分:7)

假设:

  • Alice,有浏览器的人
  • Bob,有网站的人(你)

Bob无法控制Alice提交的内容。您的HTTP服务器是您的公共接口,您无法控制它外部发生的事情。

你必须:

  • 决定您信任的数据(auth / authz可以在这里提供帮助)
  • 完整性检查提交的数据(看看它是否合理(这个日期是一个日期?这是在过去10分钟内从同一个IP地址注册的第三个帐户吗?等))
  • 在将数据用作代码之前转义数据(例如在SQL语句或HTML文档中)

如果我们添加到玩家列表中:

  • Mallory,另一个网站的恶意人士

你可以让Mallory很难欺骗Alice提交恶意数据(这将通过Alice的用户凭据到达)。应使用usual defences against CSRF(即每个会话唯一且存储在会话数据中并作为隐藏输入形式的令牌)。

答案 1 :(得分:1)

您可以在表单中包含只有您的站点知道的令牌(并将其存储在会话变量中)。然后在提交表单时,检查该令牌是否存在且有效。如果是,继续处理表单。如果不是,则抛出错误。

这对于防御Cross-Site Request Forgery (CSRF) attacks非常有用。

答案 2 :(得分:1)

一种方法是将一个令牌(可能是一长串随机字母和数字)放在表单中隐藏的输入字段中。例如

<form action="register.php" method="post">
    <input type="hidden" name="token" value="345kfnakvngk3kglvnd00dsg9" />
</form>

然后,当您处理表单提交时,您可以检查此令牌是否存在并且它是否与您期望的令牌匹配。当然,有人可以轻松检查您的源代码以找到令牌,因此您可能希望制作一个到期的令牌。

例如,当加载表单的页面时,您可以将令牌保存到会话

$_SESSION['token'] = '345kfnakvngk3kglvnd00dsg9';

然后您可以检查$_POST值是否与会话中的值匹配。通过在每个页面请求上使用新令牌,它使其更安全。

使用这种方法应该可以在某种程度上阻止垃圾邮件发送者,但是您仍然需要小心处理为您处理的表单提交的内容。基本上一个好的规则就是将通过表单提交的任何内容视为威胁,这样你就会想要

  • 清理您要插入数据库的所有数据
  • 删除任何可能已注入的JavaScript
  • 仅允许上传具有特定扩展名的文件

答案 3 :(得分:0)

提交表单后,请求进入php页面。在该页面中,您可以使用以下代码检查它是否来自您的域名:

if(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) == "yourdomain.com") {

     //process the request
} else {

     echo "Sorry";

}
编辑:同意。这不安全。只是一个糟糕的黑客

答案 4 :(得分:0)

创建随机令牌并将其与表单数据一起作为隐藏的html元素发送。将令牌与用户会话绑定,并在提交/发布表单后对其进行验证。另一个人无法发送此随机令牌,因为您的服务器在会话中没有该令牌。

还可以使用X-Frame-Options标题来避免在您的网站中将您的网页用作iframe。希望这会有所帮助。