PHP防止URL篡改



我试图找到一个好的解决方案来防止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。

如果你不是这个意思,请重新表述这个问题——你试图阻止人们做什么?

最新更新