【问题标题】:URL encode and filter sanitize output problemsURL 编码和过滤清理输出问题
【发布时间】:2019-06-17 05:39:03
【问题描述】:

我试图弄清楚为什么在进行 URL 编码时,经过净化的字符串与未经过净化的字符串的输出不同。

我不知道这叫什么,但我搜索了 URL 编码和清理并尝试了谷歌但我找不到任何解释。

我在发布视频后偶然发现了这一点,问题是我在数据库中插入标题,取出它们并用它创建一个 URL。

示例 URL(由于问题而无法使用)

localhost/proviin/video/kojima%26%2339%3Bs+cancelled+masterpiece+-+investigating+silent+hills/16

我进行了单页测试,以测试正在发生的事情和行为,如下所示。

我需要的结果如何(但这没有经过清理):

$title = "Kojima's Cancelled Masterpiece - Investigating Silent Hills";
echo $title;
echo "<br>";
echo urlencode($title);

输出:(可以在 URL 中使用)

  • 小岛被取消的杰作 - 调查寂静岭
  • 小岛%27s+取消+杰作+-+调查+寂静+山丘

怎么样

$title = sanitize("Kojima's Cancelled Masterpiece - Investigating Silent Hills", "str");
echo $title;
echo "<br>";
echo urlencode($title);

输出:(在 URL 中不起作用,但经过清理)

  • 小岛被取消的杰作——调查寂静岭

  • 小岛%26%2339%3Bs+已取消+杰作+-+调查+寂静+山丘

消毒功能

function sanitize($item, $type) {
    switch ($type) {
        case "str":
            return filter_var($item, FILTER_SANITIZE_STRING);
            break;
        case "mail":
            return filter_var($item, FILTER_SANITIZE_EMAIL);
            break;
        case "url":
            return filter_var($item, FILTER_SANITIZE_URL);
            break;
        case "int":
            return filter_var($item, FILTER_SANITIZE_NUMBER_INT);
            break;
        case "float":
            return filter_var($item, FILTER_SANITIZE_NUMBER_FLOAT);
            break;
        default:
            return false;
    }
}

据我所知:

在插入数据库之前对数据进行清理。

当你回显时你会转义(htmlspecialchars)

但是为什么在使用urlencode()时输出不同的净化字符串?

如果这是正常行为,我到底如何在将字符串插入数据库表之前对其进行清理,并在带有urlencode() 的 URL 中使用它们?

【问题讨论】:

  • 永远,永远,永远不要在将某些东西放入数据库之前对其进行“清理”。您永远不知道需要哪种输出媒体来显示此数据,因此如果您对其进行清理以供在&lt;a href="DATA_HERE"&gt; 中使用,那么您将失去理智,试图使其看起来适合&lt;div&gt;DATA_HERE&lt;/div&gt;
  • 天哪,我不应该在将其放入数据库之前对其进行清理吗? :o 它不是这样工作的:插入之前:消毒当向用户显示时:转义(等 htmlspecialcharts)?
  • 我不同意@MonkeyZeus,如果我们不清理,页面将容易受到持久性 XSS 和 SQL 注入的攻击
  • 你应该清理输入,然后保存到数据库,并在输出时取消清理。
  • @VinaySheoran 这就是我的想法?输入数据库时​​清理,从数据库输出数据时转义(htmlspecialchars?)?但是我仍然对上面的问题要做什么感到迷茫

标签: php urlencode sanitization input-sanitization


【解决方案1】:

您正在双重转义您的字符串。您不应将 sanitize 函数的返回值传递给 urlencode()。两者都对数据进行转义,但方式不同,因此它们不能像您在这里所做的那样被链接起来(并不是说任何转义函数都应该运行两次)。

所以不,您不需要像这样在将数据插入数据库之前对其进行清理。您需要使用准备好的语句对其进行转义,以便它在从数据库返回时以相同的方式返回,准备好让urlencode()htmlentities() 发挥它们的魔力。除非您需要以特定方式存储数据,在这种情况下,preg_replace 可能更好。

另外,请注意,出于完全相同的原因,用户输入也不应该是 unserialized()http://php.net/manual/en/function.unserialize.php

【讨论】:

    【解决方案2】:

    在添加到数据库之前进行清理的主要目的是避免 SQL 注入。易受攻击的符号之一是单引号'。这就是为什么它被其他看起来相同但对数据库没有任何影响的符号所取代。

    因此,当您进行消毒时,您会替换易受攻击的符号。在 URL 编码之后,这些符号有不同的代码。为了防止不兼容的 URL,始终在清理之后或至少在相同操作之后对字符串进行编码。

    【讨论】:

      【解决方案3】:

      每当我使用输入文本作为文件名或文件夹时,我都会使用此功能对其进行清理。

      /* urlsafe - Return a URL safe string */
      public static function urlsafe($t)
      {
          $t = strtolower($t);
          $t = preg_replace( "/[^a-z0-9]/", " ", $t);
          $t = trim($t);
          $t = preg_replace("/[ ]+/", "-", $t);
          return($t);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-10
        • 1970-01-01
        • 2010-11-14
        • 2013-10-21
        • 2016-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多