URL编码和过滤清理输出问题

时间:2019-01-23 15:23:34

标签: php urlencode sanitization input-sanitization

我试图弄清楚为什么在对URL进行编码时,清理过的字符串与未清理过的字符串输出会有所不同。

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

发布视频后,我偶然发现了这个问题,问题是我在数据库中插入了标题,然后将其提取并创建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 + Cancelled + Masterpiece +-+ Investigating + Silent + Hills

现状

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

输出:(其中在URL中不起作用,但已清除)

  • 小岛被取消的杰作-研究寂静岭

  • 小岛%26%2339%3Bs + Cancelled + Masterpiece +-+ Investigating + Silent + Hills

消毒功能

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中之前,我该如何清理字符串?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

/* 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);
}

答案 2 :(得分:0)

您正在对字符串进行两次转义。您不应将清理函数的返回值传递给urlencode()。两者都转义数据,但是方式不同,因此它们不能像您在此处那样被链接(并不是任何转义功能无论如何都应该运行两次)。

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

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