【问题标题】:securing a webpage without headers保护没有标题的网页
【发布时间】:2009-04-08 08:30:54
【问题描述】:

我刚刚读到这个article on tdwtf.com。通常,它描述了一个归档机器人破坏事物,因为它忽略了标题。然后我意识到我不知道如何在没有标题的页面中进行安全保护。因此我的问题是:

除了使用标头之外,我还可以采取哪些安全措施?

我主要是用php开发,所以对header("Location:")函数比较熟悉。但是还有什么?

理想情况下,我希望替换

的逻辑
if (!$something_important) header("Location: somehereharmless.php");

还有其他(更)安全的东西吗?

【问题讨论】:

    标签: php security http-headers


    【解决方案1】:

    这个很好用

    if (!$something_important) {
      header("Location: somehereharmless.php");
      exit();
    }
    

    即使它是机器人,所以它不尊重位置,你会调用一个退出,所以执行流程无论如何都会停止,所以没有害处

    【讨论】:

      【解决方案2】:

      header: 位置很好,只要你在最后包含一个出口。 您可能还想包含一个链接或其他内容。

      我通常使用这样的东西:

      <?php
      function redirect($url)
      {
          header('Location: ' . $url);
          exit('<a href="' . $url . '">Redirecting you to: ' . $url . '</a>');
      }
      
      redirect('somepage.php');
      ?>
      

      这样人们就无法绕过重定向,并且知道他们应该被重定向。


      [编辑]

      另外,总是在删除内容时使用POST。创建一个假的GET(例如&lt;img src="http://www.example.org/action.php?do=SetAsAdmin&amp;userid=MyUserId" /&gt;)非常容易。

      【讨论】:

      • 创建POST也很容易。
      • 创建 POST 请求很容易。然而,用户不太可能发出“意外”的 POST 请求。
      • 选择了这一项,因为解释更好一些。谢谢!
      【解决方案3】:

      确保你的所有获取都是幂等的

      幂等意味着多次执行相同的请求与执行一次具有相同的效果。

      【讨论】:

        【解决方案4】:

        我想说,如果您有一个 PHP 脚本执行某些只有登录用户才能执行的操作,那么您必须正确检查是否已登录存在于同一个脚本中,因此您可以一目了然地看到代码是安全的。我的规则是保护安全代码只有两种有效模式:

        if (user_is_authorized()) {
            // restricted code here
        }
        

        或 Alekc 的

        if (!user_is_authorized()) {
            // send headers or whatever if you want
            exit();
        }
        // restricted code here
        

        老实说,当我读到那篇文章时,我相当震惊……或者至少失望……我无法理解为什么有人会得出这样的结论,即可以使用 HTTP 标头保护网站。标头只不过是您的服务器发出的一些文本。这是客户可以随意遵循或忽略的指令(至少,出于安全目的,您必须这样考虑)。就我而言,传出(响应)HTTP 标头对于安全性几乎没有用处。 (这不包括诸如 HTTP 身份验证之类的事情,您在其中发送一个标头并得到一个作为响应......但在这种情况下,您的安全性基于该回复标头的内容,而不是您发送的标头。)

        【讨论】:

          【解决方案5】:

          您提供的链接中报告的事件的原因是header(); 后面缺少exit; 语句。如果脚本停止,机器人不会造成任何伤害。-

          【讨论】:

            【解决方案6】:
            if (!$something_important) {
              header("Location: somehereharmless.php");
              //close all your db connections and other stuff you need to end..parhaps calling a function?
              die("If the redirect doesnt start in 3 seconds, please <a href=\"somehereharmless.php\">click here</a>");
            }
            

            【讨论】:

              【解决方案7】:

              你的解决方案是

              <?php
              die($errormessage);
              

              Die 只会停止你的脚本,而不是通过启动,不要收集任何你不应该收集的数据。

              【讨论】:

                【解决方案8】:

                除了 Alekc 的回答。如果您有许多 header("Location:") 语句,并且此人符合所有条件。最后一个会触发。

                if($foo && $bar)
                {
                    header("Location: somehereharmless.php");
                }
                
                if($foo && $baz)
                {
                    header("Location: someotherplace.php");
                }
                

                因此,如果该用户设置了所有 3 个变量,他将被重定向到 someotherplace.php。除非你有一个 exit();或模具();在 header() 之后;

                【讨论】:

                  猜你喜欢
                  • 2013-04-06
                  • 2018-05-01
                  • 2012-03-02
                  • 2012-04-11
                  • 2011-04-06
                  • 2013-08-31
                  • 2010-10-03
                  • 2015-12-12
                  • 1970-01-01
                  相关资源
                  最近更新 更多