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

标签 php forms session validation

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

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

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

最佳答案

您无法确保数据来自表单。 POST 请求只是一个 POST 请求,它可以通过多种方式生成。 HTML 表单只是那些非常用户友好的方法中的一种。。您的服务器需要验证通过 POST 请求接收的数据是否有效以及是否对其采取行动。

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

$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');
}

这只是一个简单的示例,您可能希望按字母顺序对键进行排序,以确保您将获得相同的哈希等。它演示了用户需要为每个请求提供唯一 token 的概念,尽管这会阻止调整表格并提交比想要的更多或更少的数据。

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

关于php 你如何确保 $_POST 数据来自你的表单而不是外部影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10527257/

相关文章:

javascript - jQuery 验证普通按钮上的表单(不提交)

python - 从 web 服务器日志中免费实现用户 session 计数?

PHP 在 WHERE 子句中使用 $_SESSION ['user' ] 插入 MySQL 数据库

javascript - 禁用今天后 2 天日期选择器

PHP对多维数组进行排序

php - 为不同的数据库引擎实现数据映射器时如何防止重复?

javascript - symfony2 从 Controller 访问 $_SESSION

php - 获取深度不确定的多维数组的叶子节点值

javascript - 使用 Parsley.js 进行远程验证

python - Django ManyToManyField 指定中间模型。通过 OneToOneField 关系