SQL注入是常见的WEB攻击,百度百科上的解释是:
“所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。”
举个例子:
使用用户名和密码登陆网站时,用户名填入 123' or 1=1# ,密码也类似 123' or 1=1# 。这时,攻击者是猜测后台的sql命令可能是:
SELECT * FROM users WHERE username=### and password=###;
如果注入成功,SQL命令就变成了:
select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'
这样,攻击者就可以成功登陆了。
防止SQL注入的方法,很重要的一条就是预编译。所谓预编译就是把sql命令和参数分开处理,这是根据SQL命令执行的逻辑来的。SQL语句的执行包含几个步骤,分析,编译,优化,执行等。如果SQL命令中的参数,如上例中的123' or 1=1# ,在编译阶段就包含在命令中了,那么就会被sql执行;否则,就只是作为一个参数去表匹配,不会被解释执行了。
在python中,预编译是通过把参数放在execute()函数的参数中来实现的。举例说明:
cur.execute('SELECT * FROM users WHERE username=%s and password=%s', args )
反面对比的是下面的语句,下面的语句中,参数在SQL语句编译之前已经是SQL语句中的一部分了,就会被SQL注入攻击:
sql = 'SELECT * FROM users WHERE username=%s and password=%s' %(user, pass)
cur.execute(sql)