Php 防止伪造表单向服务器发送数据
假设我有一个comments表单,我想防止坏用户复制表单html源代码,并使用action属性在我网站之外的其他地方使用它 我该怎么办 我有一个简单的想法,但我不知道它是否有效(甚至我也不知道使用什么php方法) 我们的想法是在页面中添加一个变量$ip,这个$ip是php文件(和表单)的位置(可能使用$\u SERVER['php\u INFO']或其他)。。。然后使用POST方法将此变量发送到add.php文件,但不在html代码源中显示 在add.php中,服务器将检查页面的ip是否等于服务器的ip地址,然后决定是添加注释还是终止操作 我希望讨论一下这个问题 先谢谢你Php 防止伪造表单向服务器发送数据,php,forms,ip,Php,Forms,Ip,假设我有一个comments表单,我想防止坏用户复制表单html源代码,并使用action属性在我网站之外的其他地方使用它 我该怎么办 我有一个简单的想法,但我不知道它是否有效(甚至我也不知道使用什么php方法) 我们的想法是在页面中添加一个变量$ip,这个$ip是php文件(和表单)的位置(可能使用$\u SERVER['php\u INFO']或其他)。。。然后使用POST方法将此变量发送到add.php文件,但不在html代码源中显示 在add.php中,服务器将检查页面的ip是否等于服务
$_SERVER['HTTP_REFERER'];
包含从中提交表单的URL。如果URL不是你的站点,那么你可以期望它来自你的服务器,只要他们没有试图欺骗标题
更好的选择是在隐藏的输入中生成唯一的键。大致如下:
<?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; ?>" />
包含从中提交表单的URL。如果URL不是你的站点,那么你可以期望它来自你的服务器,只要他们没有试图欺骗标题
更好的选择是在隐藏的输入中生成唯一的键。大致如下:
<?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; ?>" />
您可以执行以下操作:
生成唯一的散列
将该散列存储在会话中
实现一个隐藏字段,将哈希作为值
检查提交页面上的哈希
您可以执行以下操作:
生成唯一的散列
将该散列存储在会话中
实现一个隐藏字段,将哈希作为值
检查提交页面上的哈希
这称为跨站点请求伪造(CSRF)。Rails已经内置了这个。我不知道您使用的是什么PHP框架,但我知道CakePHP也内置了它
如果您不使用PHP框架,或者您正在使用的框架没有此功能,您可以通过谷歌搜索CSRF-protection-PHP
,然后单击第二个链接(http://codeutopia.net/blog/2008/10/16/how-to-csrf-protect-all-your-forms/).这称为跨站点请求伪造(CSRF)。Rails已经内置了这个。我不知道您使用的是什么PHP框架,但我知道CakePHP也内置了它
如果您不使用PHP框架,或者您正在使用的框架没有此功能,您可以通过谷歌搜索CSRF-protection-PHP
,然后单击第二个链接(http://codeutopia.net/blog/2008/10/16/how-to-csrf-protect-all-your-forms/).您可以提供一个隐藏的输入或使用会话变量来执行CSRF保护。您可以提供一个隐藏的输入或使用会话变量来执行CSRF保护。这听起来很难做到。当然,您无法对用户完全隐藏该机制,因为在客户端加载页面时,您必须向客户端发送某种数据来识别它们,并且无法阻止用户查看该数据(即使它是数据的加密版本),无论您如何操作
我唯一能想到的就是使用会话,在生成页面时向隐藏的表单元素或cookie添加某种独特的摘要,将其存储在$\u会话中,并检查提交表单时获得的beck值是否与首先发送的值相同。这对我来说听起来相当困难。当然,您无法对用户完全隐藏该机制,因为在客户端加载页面时,您必须向客户端发送某种数据来识别它们,并且无法阻止用户查看该数据(即使它是数据的加密版本),无论您如何操作
我唯一能想到的就是使用会话,并在生成页面时向隐藏的表单元素或cookie添加某种独特的摘要,将其存储在$\u会话中,并检查提交表单时获得的beck值是否与首先发送的值相同。无法向用户隐藏html,用户是邪恶的!不,不是html,而是一个变量$ip,在服务器中工作,以获取facebook中表单的位置(黑客放置假表单的服务器),例如,我可以复制登录表单,并将其放在服务器的其他位置,然后从假facebook表单登录。我认为这是一个错误。因此,如果错误得到纠正,facebook服务器将获取myserver(我的表单)的位置(ip),然后将其与facebook服务器的ip进行比较,然后决定是否登录。你不能对用户隐藏html,用户是邪恶的!不,不是html,而是一个变量$ip,在服务器中工作,以获取facebook中表单的位置(黑客放置假表单的服务器),例如,我可以复制登录表单,并将其放在服务器的其他位置,然后从假facebook表单登录。我认为这是一个错误。因此,如果错误得到纠正,facebook服务器将获取myserver(我的表单)的位置(ip),然后将其与facebook服务器的ip进行比较,然后决定是否登录将不起作用。破解这个很容易(一个机器人只需添加referer头即可)。不过,你有点忽略了这一点。如果他可以欺骗推荐人,那么他几乎可以轻而易举地击败CSRF代币。检查referer头的价值在于,作为一般规则,不应该仅从web内容伪造。我在回答中明确指出,它可以被操纵。谢谢。@SimoTAQI请查看$\u服务器的文档:您将看到它是用户查看当前页面的IP地址。
。不管怎样,这只是一个例子……行不通。破解这个很容易(机器人只需添加referer头)