我正在建立一个表格并保护它免受CSRF等。
session_start();
mb_internal_encoding('UTF-8');
$_SESSION['token'] = null;
//other code to check and control form
function create_token() {
$token = md5(uniqid(mt_rand(), true));
$_SESSION['token'] = $token;
return $token;
}
$newToken = create_token();
然后在我的表格中我把这个<input name=:"token" type="hidden" value="<?php echo ($newToken);?>">
。
现在,如果我想通过这样做来验证表单提交:
function user_submit_check() {
if(!isset($_SESSION['token'])) {
return false;
}
if(!isset($_POST['token'])) {
return false;
}
//This next 'if' statement always returns false
if ($_POST['token'] !== $_SESSION['token']) {
return false;
}
return true;
}
if (user_submit_token() === true) {
//process user input
} else {
die("There is a problem with verification.");
}
问题是user_submit_check()
总是返回false,(参见函数中的注释)。到目前为止,我无法找到解决方案的原因。很多消息来源都说这种方法有效。
此外,我还尝试使用$_POST['token'] !== $_SESSION['token']
echo ("posted input token" . $_POST['token'] . "stored in $_SESSION" . $_SESSION['token']);
这表明两个令牌实际上是相同的,至少在纸面上。 我可能遗漏了一些东西,但我对用PHP保护表单有点新意。
修改
分享可能很有用,我现在在一个页面上做所有安全性和所有html /表单内容。我使用它:<form action="<?php $_SERVER['PHP_SELF'];?>"
来执行脚本...(检查空表单字段等等)。
编辑2: 感谢@CBroe,指出了没有&#34;&#34;关于所有属性。
有人知道我做错了吗?
答案 0 :(得分:0)
检查项目是否已过帐。
<?php
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
if(isset($_POST['token']))
{
// Test to see if tokens match
if($_SESSION['token'] === $_POST['token'])
{
// process user input
unset($_SESSION['token']);
} else {
die('Tokens did not match');
}
} else {
die('No token found');
}
} else {
$_SESSION['token'] = md5(uniqid(mt_rand(), true));
?>
<form>
<input name=token type=hidden value="<?php echo $_SESSION['token']; ?>">
</form>
<?php
}
?>
答案 1 :(得分:0)
您应该在回复之前检查会话是否已设置
<input name="token" type=hidden
value=<?php echo (isset($_SESSION['token'])) ? $_SESSION['token'] : ''?>>
对于您要实现的目标, PHP
代码应该非常简单:
session_start();
mb_internal_encoding('UTF-8');
if(isset($_POST['submit'], $_POST['token'], $_SESSION['token'])){
if ($_POST['token'] === $_SESSION['token']){
echo 'token match';
}else{
echo 'token do not match';
}
}else{
$_SESSION['token'] = md5(uniqid(mt_rand(), true));
}