php / mysqli(使用预处理语句+绑定参数)如何防止SQL注入? Mysqli仅为变量应用“real_escape_string”或执行其他操作?
我可以说使用mysqli + prepared语句+ bind params时,下面的函数完全没用吗?
function no_injection ( $data ) {
$data = trim(strip_tags($data)); // no htm in this case.
$data = get_magic_quotes_gpc() == 0 ? addslashes($data) : $data; // useless.
$data = preg_replace("@(--|\#|;)@s", """, $data); // <--- USELESS ?
return $data;
}
由于
答案 0 :(得分:2)
addslashes()不是unicode。有相当数量的unicode序列看起来像普通文本,但在使用非unicode感知代码处理时变成了不同的东西,允许恶意用户构造一个“有效”的unicode字符串,一旦addlashes破坏字符串就会产生SQL注入攻击
你的正则表达式也一样。您尚未启用unicode模式,因此它可能会泄漏恶意unicode字符并成为常规的iso8859字符,这将破坏查询。
除此之外,每个数据库都有自己的转义要求。 MySQL理解并尊重转义的反斜杠,因此'
变为\'
。但是另一个数据库可能使用''
作为转义'
,并且为该数据库应用MySQL转义序列将毫无用处。
准备好的语句允许完全分离查询和数据。当您手动编写自己的查询时,数据库服务器绝对无法知道查询字符串的一部分是否具有潜在恶意并对其进行特殊处理。它只是看到一个查询字符串。
使用预准备语句,查询正文和进入查询的数据将保持独立,直到它们到达数据库服务器,并且数据库服务器可以处理转义本身。
用现实世界的术语来说,把一块毒面包递给他们,给他们递上一篮子牛奶,鸡蛋,面粉,一瓶毒药,酵母等等是不同的......没有办法告诉他们有毒面包,直到你吃完它然后掉下去。使用成分(也就是准备好的声明)时,DB服务器将看到这瓶毒药,并知道如何处理它。
答案 1 :(得分:0)
它还会缓存查询,这些查询会通过更多“调用”来提高性能。
- &GT; http://dev.mysql.com/doc/refman/5.1/en/c-api-prepared-statements.html - &GT; Should I use prepared statements for MySQL in PHP PERFORMANCE-WISE?