【发布时间】:2021-09-14 17:41:03
【问题描述】:
我有这个函数清理用于 SQL 注入的字符串
function _clean($clean) {
$clean = utf8_encode($clean);
$array_find = array( "(" , ")" , "," , "#" , "'" , "@" , ";" , ":" , "&");
$array_replace = array("\x28","\x29","\x82","\x23","\x27","@","\x3B","\x3A","&")
$cleaned = str_replace( $array_find,$array_replace, $clean);
return $cleaned;
}
它工作得很好,但我注意到我将$cleaned = _clean("Relaxin'"); 返回清理为"Relaxin'"; 的情况它无法删除这个单引号我不确定为什么我正在转换为 utf8。有没有人有任何想法,因为我可能不得不重写str_replace()?
我确实先尝试过:
//uses https://www.ascii-code.com/
function _clean($clean)
{
$clean = utf8_encode($clean);
$array_find = array( "(" , ")" , "," , "#" , "'" , "@" , ";" , ":" , "&");
$array_replace = array("(",")",",","#","'","@",";",":","&");
$cleaned =
str_replace( $array_find,$array_replace, $clean);
return $cleaned;
}
在转换回输出到 Internet 时留下有趣的字符“Erotic Lounge (Bare Pearls) 变成了 'Erotic Lounge Bare Pearls”,因为某种原因括号不会出现在屏幕上。
我试过了
$array_replace = array("&(",")",",","#","'","@",";",":" "&");广告似乎一切正常。
我仍然没有得到','替换为愚蠢的字符''
例如在“封面,第 1 卷”中以“封面和#第 1 卷”结尾
请问有谁知道它为什么在网页上这样做。
function _clean($clean) {
$clean = utf8_encode($clean);
$array_find = array("è", "ê", "é", "(" , ")" , "," , "#" , "'" , "@" , ";" , ":" , "&");
$array_replace = array("è","ê","é","(",")",",","#","'","@",";",":","&");
$cleaned = str_replace( $array_find,$array_replace, $clean);
return $cleaned;
}
【问题讨论】:
-
您是通过打印这个清理值还是存储在数据库中的字符串来检查它?对于 sql 注入,你应该转义特殊字符或者应该使用准备好的语句,默认情况下会处理这些事情
-
我正在从受信任的数据中清理它并尝试将其放入 SQL 中,因此它不会在插入时转储记录,因此它可以在 Internet 页面上打印。尝试使用 ascii 代码,但没关系,直到它碰到括号并插入有趣的图形时出错
-
请注意,通常“清理”数据是错误的方法。它本质上是试图找到“正确的方法”来允许用户输入作为代码执行。为什么首先允许这样做?这不是您问的具体问题,但从长远来看,How can I prevent SQL injection in PHP? 可能会提供更多帮助。完全消除 SQL 注入问题,这样的问题就没有实际意义了。
标签: php arrays database string