我以这样的字符串开头:"我想:''r''n''r''n1.)摆脱这场混乱''r''n''r''n2.)现在请"(这是"干净的"用户输入文本)。
所以本质上,我的声明是:
$query = sanitize($_POST['query']); // gives the result string
我想从这个字符串中删除"''r''n''r''n"。到目前为止,我已经尝试使用以下方法来做到这一点:
$query = preg_replace("/'r'n'r'n/", " ", $query);
或
$query = str_replace("'r'n'r'n", " ", $query);
似乎都没用?
但是,如果我执行以下操作:
$query = "I would like to:'r'n'r'n1.) Rid this mess'r'n'r'n'2.) Now Please";
$query = preg_replace("/'r'n'r'n/", " ", $query); // I tried str_replace() too
var_dump($query);
exit;
我得到了我想要的输出。。。
有人能向我解释一下为什么会发生这种情况,以及我如何解决这个问题吗?
任何建议、意见或建议都将不胜感激,因为我拔头发时几乎没有秃头。。。
谢谢!
编辑:
这可能有助于函数消毒():
function html($text)
{
return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}
function htmlout($text)
{
return html($text);
}
function cleanInput($input)
{
$search = array(
'@<script[^>]*?>.*?</script>@si', // Strip out javascript
'@<['/'!]*?[^<>]*?>@si', // Strip out HTML tags
'@<style[^>]*?>.*?</style>@siU', // Strip style tags properly
'@<!['s'S]*?--[ 't'n'r]*>@' // Strip multi-line comments
);
$output = preg_replace($search, '', $input);
$output = htmlout($output);
return $output;
}
function sanitize($input)
{
if (is_array($input))
{
foreach($input as $var=>$val)
{
$output[$var] = sanitize($val);
}
}
else
{
include "C:/wamp/www/includes/inc/main/db.inc.php";
if (get_magic_quotes_gpc())
{
$input = stripslashes($input);
}
$input = cleanInput($input);
$output = mysqli_real_escape_string($link, $input);
}
return $output;
}
唯一合适的解决方案
- 去掉
sanitize()
函数 - 使用准备好的语句将数据放入数据库
- 使用
htmlout()
函数将用户的文本显示回
您可以在此处和此处阅读更多
你有魔术引号吗?
http://php.net/manual/en/info.configuration.php#ini.magic-报价gpc
它可能是在逃避你的斜杠。
如果数据库中有文字'r'n
字符,则需要将斜杠增加四倍。
因此,理论上你应该使用这个技巧:
$query = preg_replace("/''''r''''n''''r''''n", " ", $query);
这对我有效
$string = preg_replace("/''''r''''n''''r''''n/", "", $string);