【问题标题】:PHP Prevent URL TamperingPHP 防止 URL 篡改
【发布时间】:2012-03-27 00:59:50
【问题描述】:

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

最后一段代码产生重定向错误。

【问题讨论】:

  • 显示notes.php的内容。
  • 内容无关我只想知道防止url被篡改的好方法
  • 防止篡改的最佳方法是向您信任不会篡改的人颁发 SSL 客户端证书,然后限制对 notes.php 的访问,以便只有具有有效证书可以运行脚本。除非您的会话是通过 HTTPS 传输的,否则没有人知道带有嗅探器的人会如何处理他们看到的通过网络传输的数据。明文不好。不要使用它。

标签: php get


【解决方案1】:

您是要防止此页面上的 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 Forgery”进行更多研究。希望这能让你朝着正确的方向前进。

【讨论】:

  • HTTP_REFERER 标头由浏览器提供,因此不可信。任何拥有curlwget 的人都可以轻松伪造它。
  • 几乎所有类型的安全都存在漏洞。 HTTP_REFERER 很容易被绕过,但它至少会阻碍一些人,从而增加整体保护。
  • 我不同意。实施安全的解决方案是唯一的保护。如果您知道它很容易伪造,为什么还要实施它呢?一半的解决方案只是通过分散您对实际任务的注意力来浪费时间。您不能信任 HTTP_REFERER。所以不要,继续做你可以信任的东西。
  • "HTTP referer 的检查可以用来防止 CSRF。" owasp.org/index.php/…
  • 如果我聘请的程序员尝试实现它并称之为安全,我会找一个新程序员。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 2015-01-28
    • 2017-04-30
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多