【发布时间】:2017-05-11 23:42:01
【问题描述】:
我正在做表单验证器(使用令牌)。 页面基于 smarty。所以在类文章中我有以下功能:
public static function getToken(){
self::$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = self::$token;
}
然后在 .tpl 文件中我插入了这样的值:
<input type="hidden" name="token" value="{Articles::$token}">
表单提交后,检查在 index.php 中运行:
if(isset($_POST['token']) && $_POST['token'] == $_SESSION['token']){
Articles::addComment($item, $_POST['name'], $_POST['email'], $_POST['comment']);
}
问题是我得到了不同的令牌。例如,我回显了$_SESSION['token'] 并与表单中的值进行了比较(查看源代码)。
同样在提交之后,我尝试回显($_SESSION ['token'] 和$_POST ['token]) 这两个值,它们也不同。显然,表单没有提交。
【问题讨论】:
-
为什么它们应该是一样的?在第二个请求
getToken生成新令牌并在 SESSION 中覆盖了一个,这当然与第一个不同 -
@Lashane,请您详细说明一下。我不遵循它被视为第二个请求的地方。我只调用了一次函数。
-
当您发布表单时 - 这是第二次请求,您肯定会第二次调用 getToken
-
您能推荐一些东西吗?我对此很陌生。
-
@Benua 如果在第二次请求时生成新令牌,请使用简单的条件
if(empty($_SESSION['token'])) { getToken()}