sql注入的一点学习(待更新)
什么是sql注入???
通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
假如数据库中有一张商品表goods,存放多条商品信息
当执行sql语句
select * from goods where id = 1;
查询结果当然为一条数据
当执行sql语句
select * from goods where id = 1 or 6;
这时候的执行结果会是什么呢???
结果是所有的商品信息数据都会被查询出来。
这只是查询操作,如果是被人恶意执行删除操作,那就凉凉了
当我们python代码中执行连接数据库,获取cursor对象来执行sql语句的时候,不要以拼接字符串的形式拼接sql语句,例如根据用户输入的id来拼接sql语句
sql = """select * from goods where id = %s;"""%id
如何安全的执行sql语句呢???
sql = """select * from goods where id = %s;"""
在游标对象执行sql语句的时候传参
游标对象.execute(sql语句,(参数...))
如何防止sql注入???
1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。
2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。