SQL注入 是一种代码注入 技术,它利用一个安全漏洞 的发生在数据库 层的应用 。 该漏洞存在当用户输入错误地过滤,要么是字符串 转义字符 在嵌入式的SQL 语句或用户输入不强类型 ,从而意外地执行。 它是一类更一般的漏洞可能出现的每当一个编程或脚本语言嵌入在另一个实例。 SQL注入攻击也被称为SQL注入攻击。
不正确的转义字符过滤
这对SQL注入的形式出现时,用户输入不过滤, 转义字符 ,然后被传递到一个的SQL 语句。 在关于由应用程序的最终用户数据库进行操作的语句可能这样的结果。
下面的代码行说明这个漏洞:
statement = "SELECT * FROM users WHERE name = '" + userName + "';"
此SQL代码的目的是拉动其用户从表中指定用户名的记录。 . 但是,如果“用户名”变量是在一个特定的方式制作一个恶意用户,SQL语句可能做多的代码作者的意图。 例如,设置了“ 用户名 ”变量
' or '1'='1
或使用注释,甚至阻止其他查询:
' or '1'='1';/*'
使这一由家长语言SQL语句:
SELECT * FROM users WHERE name = '' OR '1'='1';
如果此代码是要在一个认证过程中使用那么这个例子可以用来强制一个有效的用户名的选择,因为'1'= '1'的评价永远是正确的。该语句下面的值的“用户名”在下面将导致表删除“用户”,以及userinfo的表选择“所有数据从”(在本质上揭示了每个用户信息),使用的API 的允许多条语句:
a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't
这种投入呈现最终的SQL语句如下:
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';
虽然大多数的SQL服务器实现允许将多个语句执行的方式与这一个来电,API,例如一些SQL 的PHP 的mysql_query()
不允许因为安全的原因。 这可以防止攻击者注入完全独立的查询,但并不能阻止修改查询它们。
======================================================
错误类型的处理
这种形式的SQL注入时,会出现用户提供的字段不强类型的 ,或不检查类型 的限制。 这可能发生在一个数字字段是在SQL语句中使用,但程序员不作任何检查,以验证用户提供的输入是数字。 例如:
statement := "SELECT * FROM userinfo WHERE id = " + a_variable + ";"
正是从这一声明清楚,作者的意图a_variable是数字,关联到的“ID”字段。 但是,如果它其实是一个字符串 ,那么最终用户 可以操纵的发言,因为他们选择,从而绕过需要的字符转义。 例如,要设置a_variable
1;DROP TABLE users
将下 drop (delete)从数据库中的“用户”表,因为SQL将呈现如下:
SELECT * FROM userinfo WHERE id=1;DROP TABLE users;
==============================
在数据库服务器中的漏洞
有时,漏洞可以存在于数据库服务器软件本身,因为是与案件的MySQL 服务器的mysql_real_escape_string()
函数[2] 。 . 这将允许攻击者执行SQL注入攻击成功的Unicode字符的坏,即使用户的输入被逃脱。 这个问题已经打上了版本5.0.22发布(05月06日24日发布)。
盲SQL注入
盲SQL注入是一个Web应用程序时使用很容易受到SQL注入,但注入的结果是不可见的攻击者。 与此漏洞的网页可能是一个不显示数据,但会显示不同的逻辑语句进入合法的SQL语句注入的页面调用的结果而定。 这种类型的攻击可以成为时间密集,因为一个新的语句必须为每个位制作的恢复。 有几个工具,可以自动建立这些攻击一旦该位置的漏洞和目标信息。
有条件的回应
一个盲目的SQL注入式强制数据库,以评估对一个普通的应用程序屏幕上的一个逻辑语句。
SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=1;
会导致正常的页面,而
SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=2;
可能会给出不同的结果如果页面很容易受到SQL注入。 这就像一个注入攻击者可能会建议一个盲目SQL注入是可能的,攻击者留下的语句,制定评估为真或假表列或不同的内容之外的另一个SELECT语句的列列表。
=================================
有条件的错误
这种盲目的SQL注入式的原因,迫使数据库,以评估一份声明中导致错误,如果WHERE语句为真一个SQL错误。 例如,
SELECT 1/0 FROM users WHERE username='Ralph';
由零司将只进行评估,并导致错误,如果用户“Ralph”存在。
时间延迟
时滞是一种盲目的SQL注入类型,导致SQL引擎执行一个长时间运行的查询或延时语句的逻辑依赖注入。 攻击者就可以测量时间的页面需要加载,以确定是否注入的说法是正确的。
=============
防止SQL注入
为了防止SQL注入,用户输入不能直接嵌入SQL语句。 相反,必须使用参数化语句(首选)或用户输入必须仔细逃跑或过滤。
参数化语句
对于大多数开发平台,采用参数化语句可以带参数的工作,而不是嵌入在语句的用户输入(有时称为占位符或绑定变量)。 . 在许多情况下,SQL语句是固定的,每个参数是一个标量,而不是一个表。 用户输入,然后分配(方向)的参数。 这是一个使用Java和JDBC的 API的:
PreparedStatement prep = conn.prepareStatement("SELECT * FROM USERS WHERE USERNAME=? AND PASSWORD=?");
prep.setString(1, username);
prep.setString(2, password);
prep.executeQuery();