Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 防止伪造表格_Php_Security - Fatal编程技术网

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页面,它向自己提交表单。 我想添加一个检查,在那里我可以阻止基本的跨站点伪造

我的代码:

<?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