不值得信赖的addslash()和mysql_real_escape_string()

|

长久以来,我一直依赖mysql_real_escape_string()防范SQL injection。看起来它并不像我想象的那么值得信赖。

问题来自多字节编码。例如在GBK里,0xbf27并不是一个合法的双字节字符,因此addslash()会把它转义成0xbf5c27,碰巧0xbf5c是一个合法的双字节字符,由此可以注入一个0x27 (')。

addslash()无药可救。mysql_real_escape_string()可以根据字符集正确地转义,但是需要在建立数据库联接的时候指明“SET CHARACTER SET 'GBK'”。

无药可救 ??

无药可救 ??

可以用SET CHARACTER啊!

可以用SET CHARACTER啊!

mysql_real_escape_string()是

mysql_real_escape_string()是可靠的
但如果没有服务器控制权,而magic_quotes_gpc开了的话
还要先stripslashes再mysql_real_escape_string???

但stripslashes后还不一

但stripslashes后还不一定能恢复原来

发表新评论

此内容将保密,不会被其他人看见。
  • 允许 HTML标签: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <h3> <pre> <blockquote>
  • 行和段被自动切分。
  • You can use BBCode tags in the text, URLs will be automatically converted to links
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
更多格式化选项信息