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

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

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

清单:

启用严格的SQL模式,以告诉服务器对其接收的数据值有更多的限制。请参见 第5.1.11节“服务器SQL模式”。

尝试在所有Web表单中输入单引号和双引号('和")。如果您遇到任何MySQL错误,请立即调查问题。

尝试通过在其上添加%22 ("),%23 (#)和%27 (')来修改动态URL 。

尝试使用前面示例中显示的字符,将动态URL中的数据类型从数字类型修改为字符类型。您的应用程序应该对这些和类似的攻击是安全的。

尝试在数字字段中输入字符,空格和特殊符号,而不要输入数字。您的应用程序应在将它们传递给MySQL之前将其删除,否则会产生错误。将未经检查的值传递给MySQL非常危险!

在将数据传递给MySQL之前,请检查其大小。

让您的应用程序使用与用于管理目的的用户名不同的用户名连接到数据库。不要给您的应用程序不需要的访问权限。

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

MySQL C API:使用 mysql_real_escape_string_quote() API调用。

MySQL ++:对查询流使用escape和 quote修饰符。

PHP:使用mysqli或 pdo_mysql扩展名,而不使用旧的 ext/mysql扩展名。首选的API支持改进的MySQL身份验证协议和密码,以及带占位符的预备语句。另请参阅选择API。

如果ext/mysql必须使用较旧的扩展名,则为了转义而使用该mysql_real_escape_string_quote() 功能,而不要使用此 功能, mysql_escape_string()或者 addslashes()因为仅支持 mysql_real_escape_string_quote() 字符集;使用(无效)多字节字符集时,可以“ 绕过 ”其他功能 。

Perl DBI:使用占位符或quote() 方法。

Ruby DBI:使用占位符或quote() 方法。

Java JDBC:使用PreparedStatement对象和占位符。

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