有些朋友刚接触SQL编程,对SQL注入了解不多。以下是什么是SQL注入以及如何预防它。
首先,介绍什么是SQL注入。SQL注入是指在编程中,SQL语句中的参数可以通过客户端传输到数据库中执行,对传输内容的过滤不当导致SQL执行出现意外结果。现在举例说明SQL注入。
现在我们要做一个用户登录框。您可以输入用户名和密码。如果用户名和密码正确,则可以成功登录,否则登录失败。界面如下:
以下语句可能出现在验证用户名和密码中。
语句中的用户名和密码将由客户端传入。如果正常输入,那么用户名和密码都是正确的,会提示【太好了,恭喜你又过了一关!】。
出现了一个问题。在这段代码中,没有对用户输入进行过滤或字符转换。如果我们的用户名和密码都传入['或' '='](不带括号,相信我,这个用户名和密码肯定不是保存的正确用户名和密码)会怎么样?
结果是一样的,会提示恭喜,又过了一关。为什么会这样?所以现在就来分析一下。在后台程序中,我们使用SQL[select * from 2 user where yhm=' ' a ' '和mima='' b'']来验证用户名和密码。其中A和B是用户填写的用户名和密码。如果不明白,请参考第二张图的整个后台验证码。
如果我们输入的用户名和密码都是[果三哥],那么合并后的SQL结果就是[select * from 2userwhereyhm='果三哥',mima='果三哥']。但如果我们的用户名和密码以['或' '=']的形式输入,那么合并后的SQL结果就是[select * from2userwhereyhm='或' '='和mima='或'='']。此SQL中有[or''='']。这个判断使得整个SQL语句的Where条件总是为真,从而可以找到表[2user]的所有记录。从而成功登录。喜欢的朋友也可以尝试在用户名中输入['或' '-],密码也可以随意输入。
这是SQL注入。通过输入一些特殊字符,您可以改变SQL语句的原始目的,并获得额外的效果。那么应该如何预防呢?其实很简单。只要我们禁止用户输入一些特殊字符,或者在后台转换这些特殊字符,或者所有SQL语句都写成存储过程,就可以避免被SQL注入攻击。