PHP防止URL篡改

PHP防止URL篡改,php,get,Php,Get,我试图找到一个好的解决方案,以防止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重写。到目前为止我有

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被篡改,最好在敏感页面上检查
$\u服务器['HTTP\u REFERER']
,方法如下:

if ($_SERVER['HTTP_REFERER'] !== "previous_page.php") {
 header("Location: error_page.php");
 session_destroy();
 exit;
}
但这并不是充分的证据,因为如果攻击者位于
上一页.php
上,他只需浏览到我们试图保护的页面,因此需要进一步的保护

您可以(而且应该)实现一个令牌系统。这是这样做的:

$_SESSION['token'] = md5(uniqid(rand(), TRUE));
$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;
}
这将生成一个很好的长字符串,该字符串对于浏览该页面的用户来说是唯一的。这样做的目的是将此会话变量作为
$\u GET
变量传递到下一页,然后比较两者以确保它们相等。这是这样做的:

$_SESSION['token'] = md5(uniqid(rand(), TRUE));
$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


如果你不是这个意思,请重新回答这个问题-你在试图阻止人们做什么?

显示notes.php的内容。这些内容无关紧要。我只想知道一个防止url篡改的好方法防止篡改的最好方法是只向你信任的人颁发SSL客户端证书,不要篡改,然后限制对notes.php的访问,以便只有具有有效证书的浏览器才能运行脚本。除非您的会话是通过HTTPS传输的,否则不知道使用嗅探器的人会如何处理他们看到的跨线数据。明文是不好的。不要使用它。HTTP\U REFERER标头由浏览器提供,因此不可信。任何拥有
curl
wget
的人都很容易伪造它。几乎所有类型的安全性都存在漏洞<代码>HTTP_REFERER很容易通过,但它至少让一些人感到困惑,这增加了整体保护。我不同意。实施安全的解决方案是唯一的保护。如果你知道它很容易伪造,为什么要实现它呢?半途而废的解决方案会让你从真正的任务中分心,从而浪费时间。您不能信任HTTP\u REFERER。所以不要这样做,继续做一些你可以信任的事情。”HTTP引用程序的检查可以用来防止CSRF。“如果我雇佣的程序员试图实现这一点并称之为安全的,我会找一个新的程序员。