1.什么是SQL注入?
所谓的SQL注入就是将SQL命令插入Web表单以提交或输入域名或页面请求的查询字符串,最后欺骗服务器执行恶意SQL命令。例如,以前的许多影视网站大多通过WEB表单泄漏了VIP会员密码。当查询字符暴露时,这种形式特别容易受到SQL注入攻击。当应用程序使用输入来构造动态SQL语句来访问数据库时,就会发生SQL注入攻击。如果代码使用存储过程,并且这些存储过程作为包含未过滤的用户输入的字符串传递,则也将发生SQL注入。黑客可以通过SQL注入攻击来访问网站数据库,然后可以获取网站数据库中的所有数据。恶意黑客可以使用SQL注入来篡改数据库中的数据,甚至破坏数据库中的数据。作为Web开发人员,您讨厌这种黑客攻击。当然,有必要了解SQL注入的原理,并学习如何通过代码保护您的网站数据库。
二,sql注入原因
Sql注入攻击是利用设计漏洞在目标服务器上运行Sql语句并执行其他攻击的攻击。动态生成Sql语句时无法验证用户输入的数据是Sql注入攻击成功的主要原因。对于JAVA数据库与JDBC的连接,SQL注入攻击仅对Statement有效,而对PreparedStatement无效,因为PreparedStatement不允许在不同的插入时间更改查询的逻辑结构。
例如,用于验证用户是否存在的SQL语句为:
用户名和密码=“密码”
如果您在用户名字段中输入:“或1 = 1”,或者在密码字段中输入:“或1 = 1
验证将被绕过,但是此方法仅对Statement有效,对PreparedStatement无效。与Statement相比,具有以下优点:
1.反注射攻击
2.快速运行多次
3.防止数据库缓冲区溢出
4.代码易于阅读和维护
这四点使PreparedStatement成为访问数据库的语句对象的首选。缺点是灵活性不够好,在某些情况下必须使用Statement。
三,sql注入原理
下面让我们讨论一下SQL注入的原理,以便读者对SQL注入攻击有一个感知上的理解。至于其他攻击,原理是相同的。
SQL注入使攻击者可以绕过身份验证机制,并完全控制远程服务器上的数据库。 SQL是结构化查询语言的缩写,它是访问数据库的事实上的标准。当前,大多数Web应用程序都使用SQL数据库来存储应用程序数据。几乎所有的Web应用程序都在后台使用某种SQL数据库。与大多数语言一样,SQL语法允许将数据库命令和用户数据混合在一起。如果开发人员不注意,则用户数据可能会解释为命令。这样,远程用户不仅可以将数据输入Web应用程序,还可以在数据库上执行任意命令。
SQL注入攻击有两种主要形式。一种是将代码直接插入到与SQL命令串联的用户输入变量中,并使其执行。我上面引用的示例就是使用这种方法。因为它直接与SQL语句绑定,所以也称为直接注入攻击。第二种是间接攻击方法,它将恶意代码注入到字符串中以存储在表中或存储为原始数据。存储的字符串将连接到动态SQL命令以执行一些恶意SQL代码。注入过程的工作方式是尽早终止文本字符串,然后附加新命令。以直接注入攻击为例。也就是说,当用户输入变量时,请先以分号结束当前语句。然后插入恶意的SQL语句。由于插入的命令可能在执行之前附加其他字符串,因此攻击者经常使用注释标记“ —”来终止注入的字符串。当执行该语句时,系统将认为以下语句将被注释,因此后续文本将被忽略,而无需编译和执行。
四。 SQL注入攻击的简单示例:
在这里,我们给出一个更常见的示例来简要解释SQL注入的原理。假设我们有一个用户表,其中有两个字段用户名和密码。在我们的Java代码中,我们的初学者习惯于进行SQL拼接以进行用户身份验证。例如:“从用户中选择ID,其中用户名='“ +用户名+”'和密码='“ +密码+”'“其中用户名和密码是我们从Web表单访问的数据。让我们看一个简单的注入。如果在表单的用户名输入框中输入'或1 = 1--,我们将在密码表单中输入一些内容。如果在此处输入123,则要执行的命令sql语句将成为username =''或1 = 1--和password ='123'的用户的select id,让我们看一下此sql,因为1 = 1是true,密码='123'已注释掉。因此,此处完全跳过了sql验证。