Php 防止伪造表格
我有一个php页面,它向自己提交表单。 我想添加一个检查,在那里我可以阻止基本的跨站点伪造 我的代码:Php 防止伪造表格,php,security,Php,Security,我有一个php页面,它向自己提交表单。 我想添加一个检查,在那里我可以阻止基本的跨站点伪造 我的代码: <?php session_start(); (...) //some code $secret = substr(md5(uniqid(rand(), true)), 1, 2); $_SESSION["secret"] = $secret; $auth = $secret; ?> (...) <form id="form" name="form" action=
<?php
session_start();
(...) //some code
$secret = substr(md5(uniqid(rand(), true)), 1, 2);
$_SESSION["secret"] = $secret;
$auth = $secret;
?>
(...)
<form id="form" name="form" action="<?php echo htmlentities($_SERVER[PHP_SELF]); ?>" method="post">
(...)
<input type="hidden" name="id" value="<? echo $auth; ?>" />
(...)
<?php
(...)
//as a debug I just tried to display
echo $_POST["id"];
echo "=";
echo $_SESSION["secret"];
(...)
?>
<div>
</body>
</html>
但是现在如果没有$\u会话[秘密]
页面返回:
<input type="hidden" name="id" value="" />
我理解为什么,因为只有会话变量存在时才设置秘密。
有什么建议吗
更新
在生成新会话密钥之前移动了检查,并且仅检查是否有id的帖子。现在工作正常,谢谢 一旦您打开一个页面,$auth将生成,提交后我将在隐藏字段中,$\u会话[secret]将更改,因为$secret将生成新密钥,但$\u POST['id']是来自POST方法的旧密钥。您总是生成一个新的$secret,因此它总是不同的。您可以检查$\u会话['secret']是否存在,如果不存在,则创建一个新变量。比如:
if(!isset($_SESSION["secret"])){
$secret = substr(md5(uniqid(rand(), true)), 1, 2);
$_SESSION["secret"] = $secret;
$auth = $secret;
}
在调试代码执行时,密码已更改:
echo $_POST["id"]; // previous secret
echo "=";
echo $_SESSION["secret"]; // new secret
只要在生成下一个密钥之前在脚本开头检查匹配项,就可以了。这是因为您在页面顶部重新生成$secret并将其分配给会话吗?啊,我想我应该只在ID不存在的情况下生成一个新的会话密钥?是的,如果空$\u POST['ID']{//generate new key}
echo $_POST["id"]; // previous secret
echo "=";
echo $_SESSION["secret"]; // new secret