web安全开发 - 预编译防止sql注入

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)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值