防止虚假表单向服务器发送数据

时间:2011-08-23 12:56:22

标签: php forms ip

假设我有一个评论表单,并且我想防止坏用户复制表单html源代码,使用action属性在我网站外的其他地方使用它。

我必须做什么?

我有一个简单的想法,但我不知道它是否有效(即使我不知道使用什么php方法)

这个想法是在页面中添加一个变量$ ip,这个$ ip是php文件(和表单)的位置(可能使用$ _SERVER ['PHP_INFO']或其他)...然后将此变量发送到使用POST方法添加add.php文件,但不在html代码源中显示。

在add.php中,服务器将检查页面的ip是否等于服务器的ip地址,然后它将决定是否添加注释或终止操作。

我希望讨论这个问题

提前谢谢

5 个答案:

答案 0 :(得分:7)

您可以执行以下操作:

  1. 生成唯一的哈希。
  2. 将该哈希存储在会话中。
  3. 实现隐藏字段,将哈希值作为值。
  4. 检查提交页面上的哈希值。

答案 1 :(得分:5)

这称为跨站点请求伪造(CSRF)。 Rails已经内置了这个。我不知道你正在使用什么PHP框架,但我知道CakePHP也内置了它。

如果您不使用PHP框架,或者您使用的框架没有此功能,您可以通过Google CSRF protection PHP并点击第二个链接(http:// codeutopia。净/博客/ 2008/10/16 /如何对CSRF保护,所有的表单/).

答案 2 :(得分:4)

$_SERVER['HTTP_REFERER'];

包含表单提交的URL。如果网址不是您的网站,那么只要他们没有尝试欺骗标题,您就可以从服务器获取该网址。

http://www.php.net/manual/en/reserved.variables.server.php

更好的选择是在隐藏输入中生成唯一键。有点像:

<?php
$my_salt = 'fs gadfgasfhg usfaghsa gosg435435874542584 htrwhgsfgbsfgu';
$hash = sha1($_SERVER['REMOTE_ADDR'] . date('d/m/y') . $my_salt);
?>
<input type="hidden" value="<?php echo $hash; ?>" />

然后,在提交表单时,重新创建哈希值并将其与使用表单回发的哈希值进行比较。显然,我在上面生成的哈希只会为您提供最低限度的安全性,而您确实应该让它更安全。

答案 3 :(得分:1)

您可以提供隐藏输入或使用会话变量来执行CSRF保护。

答案 4 :(得分:1)

对我来说这听起来很难。当然,没有什么可以完全隐藏用户的机制,因为你必须在加载页面时向客户端发送某种数据来识别它们,并且没有什么可以阻止用户查看该数据(甚至如果它是数据的加密版本,那么你可以这样做。

我唯一能想到的就是使用会话,并在生成页面时为隐藏的表单元素或cookie添加某种独特的摘要,将其存储在$ _SESSION中并检查当你得到的值时提交的表单与首先发送的值相同。