使用mysql排序规则的安全问题/ sql注入?

时间:2010-09-08 08:15:28

标签: php mysql security collation

也许我对此还没有足够的了解,所以我正在寻找一个方向。

我们所有的表都显示了latin1_swedish_ci的排序规则。这是我在mysql变量中看到的内容:

collation connection utf8_general_ci
(Global value) latin1_swedish_ci
collation database latin1_swedish_ci
collation server latin1_swedish_ci

现在,我们经常看到存储在数据库中的utf8(或者至少是外语内容),并且它正确呈现。整理是否与此无关?

在用户输入上使用像php addslashes()之类的东西 - 这是否足够?或者,这会留下注射机会吗?

编辑: 所以,看看完整的整理/字符集设置,至少在phpmyadmin中,我看到:

character set client    utf8
(Global value)  latin1
character set connection    utf8
(Global value)  latin1
character set database  latin1
character set filesystem    binary
character set results   utf8
(Global value)  latin1
character set server    latin1
character set system    utf8
character sets dir  /usr/share/mysql/charsets/
collation connection    utf8_general_ci
(Global value)  latin1_swedish_ci
collation database  latin1_swedish_ci
collation server    latin1_swedish_ci

2 个答案:

答案 0 :(得分:2)

collation仅描述用于比较特定字符集的字符的规则。一条规则可能是a等于Ab等于B等,或者ß等于ss,{ {1}}等于ä等等。

要显式转义MySQL的字符串,请使用mysql_real_escape_string。此函数与addslashes相反,mysql_escape_string将连接的实际字符编码考虑在内。

但您需要使用mysql_set_charset设置连接的字符编码。因为否则将无法识别更改(请参阅C API Functions Description – mysql_real_escape_string()):

  

如果需要更改连接的字符集,则应使用mysql_set_character_set()函数,而不是执行ae(或SET NAMES)语句。 mysql_set_character_set()的作用类似于SET CHARACTER SET,但也影响mysql_real_escape_string()使用的字符集,SET NAMES没有。

答案 1 :(得分:0)

  

我们所有的表都显示了latin1_swedish_ci的排序规则   外语内容呈现正确

您的数据库有问题 它将无法存储非拉丁字符或无法正确排序/过滤数据库内容。

要存储外来字符,应为表设置utf8字符集。以及连接字符集。

  

在用户输入上使用像php addslashes()这样的东西 - 这还不够吗?

如果你的charsets只有latin1和utf8,那么

addslashes就足够了。 但其余的都是错的。

  1. addslashes()或其他转义函数不单独帮助!它仅适用于转义数据周围的引号。因此,它应该不只是“使用类似addslashes()的东西”而是“使用类似addslashes()的东西来引用字符串并为数字输入类型”
  2. 不是用户输入!逃避不是为了消毒!这只是为了正确格式化查询。任何查询。有任何数据。不仅是用户输入,正如这个贫穷世界中的每个人都认为的那样,而是任何数据(以查询作为引用字符串)。