PHP防止URL篡改

时间:2012-03-27 00:59:50

标签: php get

我试图找到一个好的解决方案来防止网址重写。到目前为止我有

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");
}

最后一位代码会产生重​​定向错误。

2 个答案:

答案 0 :(得分:1)

您是否尝试阻止此页面上的网址篡改,或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 Forgery”进行更多研究。希望这能让你朝着正确的方向前进。

答案 1 :(得分:0)

您尝试避免的“网址篡改”似乎只允许登录用户访问网页?如果是这种情况,请给他们一个签名的cookie,或者你保存在cookie中的会话ID。

如果那不是你的意思,请重新说出这个问题 - 你想阻止别人做什么?