有没有办法确保我的代码收到的 $_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/