【问题标题】:I have a function that is not replacing all characters我有一个不能替换所有字符的功能
【发布时间】: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("&#40","&#41","&#44","&#35","&#39","@","&#59","&#58","&"); 
   $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("&egrave","&ecirc","&eacute","(",")","&#44","&#35","&#39","@","&#59","&#58","&");
$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


【解决方案1】:

你会期待什么?您正在用 \x27 替换单引号 ',这只是写单引号的另一种方式。

如果你想用\x27 替换单引号,即你希望得到的字符串是Relaxin\x27,你必须转义反斜杠。即使用

$array_replace = array("\\x28","\\x29","\\x82","\\x23","\\x27","@","\\x3B","\\x3A","&")

但老实说,为了防止 SQL 注入,您应该更好地信任完善的库,而不是自己编写代码。使用参数化查询,因此框架将负责在必要时正确转义值。正确转义字符串,通常不仅仅是盲目地替换一堆字符,因为它还可能取决于它们出现的上下文......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多