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

Bro*_*ias 7 php forms validation session

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

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

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

dec*_*eze 8

您无法确保数据来自表单.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');
}
Run Code Online (Sandbox Code Playgroud)

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

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