请让我知道如何允许小于字符'<'strip_tags()
代码片段
$string ="abc<123";
StringFromUser($string);
function StringFromUser($string)
{
if (is_string($string))
{
return strip_tags($string);
}
}
输出:abc
预期输出 abc<123
请让我知道如何允许小于字符'<'strip_tags()
代码片段
$string ="abc<123";
StringFromUser($string);
function StringFromUser($string)
{
if (is_string($string))
{
return strip_tags($string);
}
}
输出:abc
预期输出 abc<123
首先正确编码。
$string ="abc<123";
尽管如果您不清理 HTML 输出,则strip_tags()
无论如何都不应该使用。
strip_tags
是一种非常基本且不是很好的数据清理方法(即“将任意值打成形状”)。同样,正如您所见,这不是一个很好的功能。如果您有充分的理由,您应该只清理数据,通常没有充分的理由。问问自己,你从任意剥离价值的一部分中获得了什么。
您要么想要验证,要么逃避以避免语法问题和/或注入攻击。消毒很少是正确的做法。阅读The Great Escapism(或:使用文本中的文本需要知道的内容)以获取有关整个主题的更多背景信息。
您可以在字符串中搜索一个字符,将其取出, 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 中包含的所有字符。
问题: 使用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;
}
}