忠于品牌,精于技术

Web安全之:SQL注入攻击

不少朋友都会写SQL语句,如果你还不会写,可以看看果果以前写的文章「学学写点SQL语句,好吗?」,可是你造吗,SQL注入攻击是Web开发中最常见的一种安全问题,恶意攻击者可以利用它来获取数据库中的敏感信息、篡改数据,甚至可以获得系统的控制权限。产生SQL注入漏洞的原因也很简单,就是开发者没有对用户提交的内容进行过滤,导致了恶意SQL语句的执行。

我们来看个简单的栗子,假设有一个登录系统,用户在登录时提交用户名和密码,如果通过用户名和密码能从后台数据库中找到某个用户,那么就算登录成功了。可以写出这样的代码:

username = req.POST['username']

password = req.POST['password']

sql = "SELECT * FROM user_table WHERE username='" + username + "' AND password='" + password + "'"

可以看出,这个SQL语句是将查询语句和用户提交的数据拼接起来的,如果我提交的用户名是 guoguo ,密码是 passwd123 ,那么这个SQL语句就是:

SELECT * FROM user_table WHERE username=' guoguo ' AND password=' passwd123 '

这样看上去很正常对吧?可是,如果我是个坏人,提交的数据是这样的,用户名填的是 guoguo' -- ,密码是 123 ,那么在后台得到的SQL语句就变成这样的了:

SELECT * FROM user_table WHERE username=' guoguo ' --' AND password='123'

这里就有点蹊跷了哦,我们先看前面那个SQL语句,必须是账号密码两个条件匹配上了,才会返回guoguo这个用户的信息,否则查询不到任何结果。再看第二个SQL语句,--在SQL语句中是注释符号,它后面的语句都将被无视,那么这个语句翻译成白话就是“把用户名是guoguo的用户给我找出来”,看见没?这样完全不需要知道密码,就能拿到guoguo的用户信息,继而登录guoguo的账户。

这种通过在提交数据里面写入SQL代码,巧妙改变后台SQL执行逻辑的攻击方式,就是SQL注入攻击。

如何防范SQL注入攻击呢?其实也很简单,在这个栗子中,我们将用户输入的数据进行过滤,只允许使用字母和数字,那么这个攻击就起不到任何作用了。

当然了,你也可以写更复杂的过滤规则,不过 我们只需要记住一个原则就行了,永远不要相信外界输入的数据。现在扫描SQL注入的工具也有很多,上线前,多用安全工具扫一扫,防范有疏漏喔~