假设我有一个评论表单,并且我想防止坏用户复制表单html源代码,使用action属性在我网站外的其他地方使用它。
我必须做什么?
我有一个简单的想法,但我不知道它是否有效(即使我不知道使用什么php方法)
这个想法是在页面中添加一个变量$ ip,这个$ ip是php文件(和表单)的位置(可能使用$ _SERVER ['PHP_INFO']或其他)...然后将此变量发送到使用POST方法添加add.php文件,但不在html代码源中显示。
在add.php中,服务器将检查页面的ip是否等于服务器的ip地址,然后它将决定是否添加注释或终止操作。
我希望讨论这个问题
提前谢谢
答案 0 :(得分:7)
您可以执行以下操作:
答案 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中并检查当你得到的值时提交的表单与首先发送的值相同。