繁体   English   中英

php如何确保$ _POST数据来自您的表单而不是外部影响?

[英]php How do you ensure $_POST data is coming from your form and not a outside influence?

有没有办法确保我的代码收到的$_POST数据来自我的表单而不是外部影响。 基本上我不希望有人能够将$_POST欺骗到普遍可用的页面,例如创建帐户。 任何用户都可以访问帐户创建页面,但我想确保只有我的account_creation表单提交的数据才会被处理。

我唯一能想到的是启动$_SESSION ,然后使用隐藏输入将session_id提供给表单。 在$ _POST时,隐藏输入的值将与当前session_id匹配。

如果有更好的方法来实现这个结果? 如果有,我期待听到它。

您无法确保数据来自表单 POST请求只是一个POST请求,可以通过多种方式生成。 HTML表单只是这是非常人性化的方式之一 您的服务器需要验证通过POST请求接收的数据是否有效以及是否对其执行操作。

话虽如此,有些东西可以帮助您限制和验证正在提交的数据。 首先,要求用户使用(会话)cookie登录。 这消除了匿名用户的随机请求。 其次,您可以将一个标记作为隐藏字段嵌入到表单中,您也可以将其保存到用户的会话中。 POST请求需要包含该令牌才能生效。 令牌只是一个伪随机字符串。
您可以通过准备您希望用户提交的表单字段的哈希来增强此功能。 如果表单值应该是只读的,您也可以将值包含在哈希中。 例如:

$rand = md5(mt_rand());
$hash = sha1('lastname:firstname:email:' . $rand);

$_SESSION['rand'] = $rand;
$_SESSION['hash'] = $hash;

// on form submit:

$keys = array_keys($_POST);
$checkHash = sha1(join(':', $keys) . ':' . $_SESSION['rand']);
if ($checkHash != $_SESSION['hash']) {
    die('Form submission failed token validation');
}

这只是一个简单的例子,您可能希望按字母顺序对键进行排序,以确保您将获得相同的哈希等。它演示了用户需要为每个请求设置唯一令牌的概念,但这可以防止使用表单进行回火并提交比想要的更多或更少的数据。

这仍然不意味着用户实际使用您的表单来提交数据。

$ref = $_SERVER['HTTP_REFERER'];
if($ref !== 'some site path/index.php')
{
    die("Access Denied!");
}

这应该可以防止大多数人从外部影响力向您的数据库发布数据。

稍微好一点的是添加额外的验证,例如user_agent,user_ip和其他一些$ _SERVER变量 - 这些是我使用的两个。

因此,如您所述,创建唯一ID(或会话ID),但添加一些额外的验证,代理和IP也匹配。 不是万无一失的,但增加了另一层安全性。

编辑:我应该补充一点,你不回发用户代理; 保持服务器端并静默验证返回的会话ID。

此外,如果提交未通过验证,则永远不会向用户显示原因 - 这样作弊不知道如何跟踪它们。 您还可以添加“5个残疾人并且您已经离开”跟踪,但您需要为此进行登录。

使用会话ID肯定是一种方法。 但是大多数(如果不是全部)其他选项涉及将一些数据添加为隐藏字段。

  1. 使用CAPCHA。 这对于每个页面加载始终是唯一的,因此必须使用您的表单。
  2. 生成随机数据并将其存储在DB(或只是$_SESSION变量)中,并在提交表单后进行检查。

选项一是我为用户创建表单推荐的那个,因为它具有双重功能。 它会停止自动提交您自己的表单,同时确保$_POST数据来自您自己的表单。

这是一种防止XSRF的标准模式模式。 基本上它与你提到的类似。 在为用户呈现表单时,服务器会创建随机令牌。 它与用户的浏览器cookie相关联。 在表单提交时,它将回发到服务器。 然后,服务器将令牌与发出的令牌进行比较,并且仅在成功匹配后才执行表单操作。

在表单中放置一个唯一值并与服务器端会话中的存储值匹配有很多好的提及。 这样做,但也考虑当用户使用后退按钮时可能会发生什么,并可能尝试两次提交表单,或者他们打开第二个浏览器窗口(同一个会话!),或者他们在您的网站上使用多个表单。

不要通过不考虑你的系统来制造疯狂的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM