Php 防止伪造表单向服务器发送数据

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是否等于服务

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

我该怎么办

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

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

在add.php中,服务器将检查页面的ip是否等于服务器的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头)