1.概述
昨天面试被问了sql注入相关的问题,不会,只有自己来学习了
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。
原文链接:https://www.jianshu.com/p/dc7f63e46f4c
举个简单的例子:正常的查询语句:select * from table where username = xxx and password = xxx ,如果再登录中不做处理,这样写用户名:
'or 1 = 1 -- 这样的话,密码不写,则查询语句则变成了select * from table where username = '' or 1 = 1 -- and password = '' ,则是不需要密码就可以登录了
或者直接用户名这样填写:'; drop database mysql; 则直接将数据库删除
2. 应对方法
- 再excute里面有一个参数args可以防止注入
错误用法 :
sql = "select * from table where id=%d and name=%s" %(id, name)
正确用法:
args = (id, name)
sql = "select * from table where id=%d and name=%s"
cursor.execute(sql, args) - 将字符串进行转义
def fun(s):
value = s.replace('\\', '\\\\')
value = value.replace('\0', '\\0')
value = value.replace('\n', '\\n')
value = value.replace('\r', '\\r')
value = value.replace('\032', '\\Z')
value = value.replace("'", "\\'")
value = value.replace('"', '\\"')
return value
网友评论