5

请让我知道如何允许小于字符'<'strip_tags()

代码片段

$string ="abc<123";
StringFromUser($string);

function StringFromUser($string)
{

    if (is_string($string))
    {
        return strip_tags($string);

    }

}

输出:abc

预期输出 abc<123

4

4 回答 4

1

首先正确编码。

$string ="abc&lt;123";

尽管如果您不清理 HTML 输出,则strip_tags()无论如何都不应该使用。

于 2013-07-15T09:23:18.050 回答
1

strip_tags是一种非常基本且不是很好的数据清理方法(即“将任意值打成形状”)。同样,正如您所见,这不是一个很好的功能。如果您有充分的理由,您应该只清理数据,通常没有充分的理由。问问自己,你从任意剥离价值的一部分中获得了什么。

您要么想要验证,要么逃避以避免语法问题和/或注入攻击。消毒很少是正确的做法。阅读The Great Escapism(或:使用文本中的文本需要知道的内容)以获取有关整个主题的更多背景信息。

于 2013-07-15T09:51:36.923 回答
0

您可以在字符串中搜索一个字符,将其取出, strip_tags() 您的字符串并将该字符放回:

$string = "abc<123";
$character = "<";
$pos = strpos($string,$character);
$tag = ">";
$check = strpos($string,$tag);
if ($pos !== false && $check == false) {
    $string_array = explode("<",$string);
    $string = $string_array[0];
    $string .= $string_array[1];
    $string = strip_tags($string);
    $length = strlen($string);
    $substr = substr($string, 0, $pos);
    $substr .= "<";
    $substr .= substr($string, $pos, $length);

    $string = $substr;
} else {
    $string = strip_tags($string);
}

或者您可以使用 preg_replace() 替换您不想在 $string 中包含的所有字符。

于 2013-07-15T09:54:21.397 回答
0

问题: 使用trip_tags的目的是为了防止来自HTML或PHP注入的攻击。但是,trip_tags 不仅删除了 HTML 和 PHP 标记,还删除了带有 < 运算符的数学表达式的一部分。所以,我们看到的是“abc<123”被替换为“abc”。

解决方法: 我们所知道的是一个 < 后跟一个空格并不会被 strip_tags 识别为 HTML 或 PHP 标签。所以我所做的就是将“abc<123”替换为“abc<myUniqueID123”。请注意,< 符号后面有一个空格。而且,只有 < 符号后面的数字被替换。接下来,strip_tags 字符串。最后,将“abc<myUniqueID123”替换回“abc<123”。

$string = "abc<123";
echo StringFromUser($string);

function StringFromUser($string)
{
    if (is_string($string)) {
        //change "abc<123" to "abc< myUniqueID123", so math expressions are not stripped.
        //use myQuniqueID to identity what we have changed later.
        $string = preg_replace("/(<)(\d)/", "$1 myUniqueID$2", $string);
        $string = strip_tags($string);
        //change "abc< myUniqueID123" back to "abc<123"
        $string = preg_replace("/(<) myUniqueID(\d)/", "$1$2", $string);
        return $string;
    }
}
于 2016-06-24T18:32:53.497 回答