访问MySQL的客户端应用程序应使用以下准则来避免错误地解释外部数据或曝光敏感信息。
访问MySQL的应用程序不应该信任用户输入的任何数据,用户可能通过在Web表单、url或您构建的任何应用程序中输入特殊或转义字符序列来欺骗您的代码。如果用户试图通过输入以下内容来执行SQL注入,请确保您的应用程序保持安全
;减少数据库mysql;
成一个形式。这是一个极端的例子,但是如果您没有做好准备,使用类似技术的黑客可能会导致大规模的安全泄漏和数据丢失。一个常见的错误是只保护字符串数据值。还记得检查数字数据。如果应用程序生成一个查询,例如
从表中选择*,其中ID = 234
当用户输入该值时234
,用户可以输入该值234或1 = 1
使应用程序生成查询SELECT * FROM table WHERE ID=234 OR 1=1
.因此,服务器检索表中的每一行。这会暴露每一行,导致服务器负载过重。防止此类攻击的最简单方法是在数字常量周围使用单引号:SELECT * FROM table WHERE ID='234'
.如果用户输入额外的信息,它就成为字符串的一部分。在数字上下文中,MySQL自动将此字符串转换为数字,并从其去除任何尾随的非数字字符。有时人们认为,如果一个数据库只包含公开可用的数据,就不需要对它进行保护。这是不正确的。即使允许显示数据库中的任何行,您仍然应该防止拒绝服务攻击(例如,那些基于前一段中导致服务器浪费资源的技术的攻击)。否则,您的服务器将对合法用户失去响应。
检查表:
启用严格的SQL模式,告诉服务器更严格地限制它接受的数据值。看
尝试输入单引号(
'
和"
)在所有的Web表单中。如果你得到任何类型的MySQL错误,立即调查问题。尝试通过添加来修改动态url
%22.
("
),%23.
(#
), 和%27.
('
)。尝试使用前面示例中显示的字符从数字到字符类型修改动态URL中的数据类型。您的申请应该对这些和类似的攻击安全。
尝试在数字字段中输入字符、空格和特殊符号,而不是数字。您的应用程序应该在将它们传递给MySQL之前删除它们,否则将产生一个错误。将未检查的值传递给MySQL是非常危险的!
在将数据传递给MySQL之前,检查数据的大小。
您的应用程序使用不同于您用于管理目的的用户名与数据库连接到数据库。不要给您的应用程序任何不需要的访问权限。
许多应用程序编程接口提供了一种在数据值中逃逸特殊字符的方法。正确使用,这可以防止应用程序用户输入导致应用程序生成与您打算不同效果的语句的值的值:
MySQL SQL语句:使用SQL准备的语句并仅通过占位符接受数据值;看到
MySQL C API:使用
mysql_real_escape_string_quote ()
API调用。或者,使用C API准备的语句接口,仅通过占位符接受数据值;看到C API预制语句接口.MySQL + +:使用
逃避
和报价
查询流的修饰符。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 ()
性格是set-aware;其他功能可以是”绕过”当使用(无效)多字节字符集时。Perl DBI:使用占位符或
报价()
方法。Ruby DBI:使用占位符或
报价()
方法。Java JDBC:使用a
准备好
对象和占位符。
其他编程接口可能具有相似的功能。
应用程序有责任拦截由于使用MySQL数据库服务器执行SQL语句而发生的错误,并适当地处理这些错误。
MySQL错误中返回的信息不是毫无意义的,因为这些信息是使用应用程序调试MySQL的关键。例如,调试一个常见的10路连接几乎是不可能的选择
语句,而不提供有关哪些数据库、表和其他对象涉及问题的信息。因此,MySQL错误有时必须包含对这些对象名称的引用。
当应用程序从MySQL接收到这样的错误时,一个简单但不安全的方法是拦截它并将其逐字显示给客户端。然而,暴露错误信息是已知的应用程序漏洞类型(cwe - 209)和应用程序开发人员必须确保应用程序没有此漏洞。
例如,显示诸如此类的消息的应用程序将数据库名称和表名称为客户端公开,这是客户端可能会尝试利用的信息:
ERROR 1146 (42S02): Table 'mydb. mydb. mydb。mytable”根本不存在
相反,当它从MySQL接收到这样的错误时,应用程序的适当行为是将适当的信息,包括错误信息,包括可访问的人员可访问的安全审核位置。该应用程序可以返回更通用的东西,例如”内部错误”给用户。