我试图找到一个好的解决方案来防止url重写。到目前为止,我有
session_start();
$userEmail = $_SESSION["email"];
$user = $_GET["user"];
if(!isset($_SESSION["email"])){
header("Location:login.php");
}
if($user !== $_SESSION["email"]){
header("Location:notes.php?user=$userEmail");
}
最后一位代码会产生重定向错误。
您是否试图阻止URL对此页面或notes.php
进行篡改?
如果没有看到notes.php
或任何其他页面,就很难说。但为了防止URL篡改,最好通过以下操作检查敏感页面上的$_SERVER['HTTP_REFERER']
:
if ($_SERVER['HTTP_REFERER'] !== "previous_page.php") {
header("Location: error_page.php");
session_destroy();
exit;
}
但这并不能完全证明,因为如果攻击者在previous_page.php
上,他可以简单地浏览到我们试图保护的页面,因此需要进一步的保护。
您可以(也应该)实现一个令牌系统。这样做:
$_SESSION['token'] = md5(uniqid(rand(), TRUE));
这将生成一个漂亮的长字符串,对于浏览该页面的人来说是唯一的。这样做的目的是将此会话变量作为$_GET
变量传递到下一页,然后比较两者以确保它们相等。这样做:
$token = $_SESSION['token'];
header("Location:notes.php?user=$userEmail&token=$token");
//...then, on notes.php:
if ($_GET['token'] !== $_SESSION['token']) {
header("Location: error_page.php");
session_destroy();
exit;
}
然而,一个非常聪明的人可以绕过这一点。我建议对"CSRF伪造"做更多的研究。希望这能让你朝着正确的方向前进。
您试图避免的"URL篡改"似乎是只允许登录用户访问页面?如果是这样的话,给他们一个签名的cookie,或者你保存在cookie中的会话ID。
如果你不是这个意思,请重新表述这个问题——你试图阻止人们做什么?