2011-08-23 42 views
1

假设我有一个评论表单,并且我想阻止不良用户复制表单html源代码,并使用action属性在我的网站之外的其他地方使用它。防止虚假表单向服务器发送数据

我该怎么办?

我有一个简单的想法,但我不知道如果它的工作不是(连我自己都不知道是干什么用PHP方法)

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

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

我希望关于这个主题的讨论

预先感谢您

+2

你无法隐藏用户的html,用户是邪恶的! –

+0

不,不是html,而是一个变量$ ip在服务器上工作,为了获取表单的位置(黑客放置假表单的服务器) – SmootQ

+0

在facebook中例如,我可以复制登录表单,并把它在我的服务器的其他地方,然后登录从假Facebook的形式 我认为这是一个错误 – SmootQ

回答

7

你可以做到以下几点:

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

表单将发送散列到add.php页面,然后它会将它与会话中的散列进行比较,这是正确的?但问题是,当坏的用户从源代码复制表单时,他将复制它的散列,然后发送它 – SmootQ

+1

他将不得不复制它,每次他想提交它,这将是有效的因为根本不复制它。 –

+1

这就是为什么您每次在您的服务器上加载页面时都会生成一个新的独特哈希值,并将其存储在会话中。攻击者无法修改您存储的会话数据... – DaveRandom

4
$_SERVER['HTTP_REFERER']; 

包含表单提交的URL。如果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; ?>" /> 

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

+1

这也可以被操纵。 –

+1

不起作用。这很容易破解(一个机器人只能添加引用标题)。 – elslooo

+1

虽然你很想念这里。如果他可以欺骗引用者,那么他可以轻松击败CSRF令牌。检查引用标题的价值在于,一般来说,不应该仅仅从网页内容中伪造。 – EricLaw

5

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

如果你不使用PHP框架,或者你使用的框架没有这个功能,你可以谷歌到CSRF protection PHP并点击第二个链接(http://codeutopia.net/blog/2008/10/16/how-to-csrf-protect-all-your -形式/)。

+0

谢谢你的朋友...甚至脸书有这个bug:loool – SmootQ

1

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

1

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

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

+0

我知道,它可以隐藏它,但非常困难... – SmootQ

相关问题