6.1.7 Client 端编程安全准则

访问 MySQL 的应用程序不应信任用户 Importing 的任何数据,用户可以尝试通过在 Webtable 单,URL 或您构建的任何应用程序中 Importing 特殊或转义的字符序列来欺骗您的代码。如果用户 Importing; DROP DATABASE mysql;之类的内容,请确保您的应用程序保持安全。这是一个极端的例子,但是如果您不准备使用黑客的技术,则可能由于黑客使用类似的技术而导致大量的安全漏洞和数据丢失。

一个常见的错误是仅保护字符串数据值。切记还要检查数字数据。如果当用户 Importing 值234时应用程序生成了诸如SELECT * FROM table WHERE ID=234之类的查询,则用户可以 Importing 值234 OR 1=1来使应用程序生成查询SELECT * FROM table WHERE ID=234 OR 1=1。结果,服务器检索 table 中的每一行。这会暴露每一行并导致过多的服务器负载。防止此类攻击的最简单方法是在数字常量SELECT * FROM table WHERE ID='234'周围使用单引号。如果用户 Importing 其他信息,则所有信息都将成为字符串的一部分。在数字上下文中,MySQL 自动将此字符串转换为数字,并从中去除所有尾随的非数字字符。

有时人们认为,如果数据库仅包含公开可用的数据,则无需对其进行保护。这是不正确的。即使允许在数据库中显示任何行,您仍应防止拒绝服务攻击(例如,基于上段技术的那些导致服务器浪费资源的攻击)。否则,您的服务器将无法响应合法用户。

Checklist:

许多应用程序编程接口提供了一种在数据值中转义特殊字符的方法。如果使用得当,这可以防止应用程序用户 Importing 导致应用程序生成效果与您预期不同的语句的值:

如果必须使用较旧的ext/mysqlextensions,则为了转义,请使用mysql_real_escape_string_quote()函数,而不要使用mysql_escape_string()addslashes(),因为只有mysql_real_escape_string_quote()可以识别字符集;使用(无效)多字节字符集时,可以“绕过”其他功能。

其他编程接口可能具有类似的功能。

首页