时间:2021-05-23
1. SQL 注入
SQL 注入是非常常见的一种网络攻击方式,主要是通过参数来让 mysql 执行 sql 语句时进行预期之外的操作。
即:因为传入的参数改变SQL的语义,变成了其他命令,从而操作了数据库。
产生原因:SQL语句使用了动态拼接的方式。
例如,下面这段代码通过获取用户信息来校验用户权限:
import pymysqlsql = 'SELECT count(*) as count FROM user WHERE id = ' + str(input['id']) + ' AND password = "' + input['password'] + '"'cursor = dbclient.cursor(pymysql.cursors.DictCursor)cursor.execute(sql)count = cursor.fetchone()if count is not None and count['count'] > 0: print('登陆成功')但是,如果传入参数是:
input['id'] = '2 or 1=1'你会发现,用户能够直接登录到系统中,因为原本 sql 语句的判断条件被 or 短路成为了永远正确的语句。
这里仅仅是举一个例子,事实上,sql 注入的方式还有很多种,这里不深入介绍了。
总之,只要是通过用户输入数据来拼接 sql 语句,就必须在第一时间考虑如何避免 SQL 注入问题。
那么,如何防止 SQL 注入呢?
2. 预防 SQL 注入 – pymysql 参数化语句
pymysql 的 execute 支持参数化 sql,通过占位符 %s 配合参数就可以实现 sql 注入问题的避免。
import pymysqlsql = 'SELECT count(*) as count FROM user WHERE id = %s AND password = %s'valus = [input['id'], input['password']]cursor = dbclient.cursor(pymysql.cursors.DictCursor)cursor.execute(sql, values)count = cursor.fetchone()if count is not None and count['count'] > 0: print('登陆成功')这样参数化的方式,让 mysql 通过预处理的方式避免了 sql 注入的存在。
需要注意的是,不要因为参数是其他类型而换掉 %s,pymysql 的占位符并不是 python 的通用占位符。
同时,也不要因为参数是 string 就在 %s 两边加引号,mysql 会自动去处理。
3. 预防 SQL 注入 – mysql 存储过程
数据库存储过程是 mysql 的一种高级用法,但是一般来说,并不建议使用数据库的存储过程。
主要原因是:
但是,虽然不建议使用存储过程,但是毕竟可以依赖他实现各种跨语言的 sql 注入预防,在复杂的场景下还是有其使用价值的。(以后需要用再去详细学,这里只作简单介绍)
3.1. 存储过程编写
3.2. pymsql 中调用
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
例如:SQL注入攻击XSS攻击复制代码代码如下:任意执行代码文件包含以及CSRF.}关于SQL攻击有很多文章还有各种防注入脚本,但是都不能解决SQL注入的根本问
SQL注入产生的安全问题。绝大多数的攻击者在电子商务网站后台所遭受的非法网络攻击都可能是由于对sql的注入,sql注入语句如果本身存在了漏洞,就可能会直接导致网
最近有网友遇到了电脑关机后自动重启,总是无法关闭电脑,该怎么解决呢?下面将为你详细讲解如何解决电脑关机后自动重启的问题。 关机后自动重启的症状:当用户点击关闭
本文实例讲述了PHP简单预防sql注入的方法。分享给大家供大家参考,具体如下:出现sql注入一般都是因为语法不规范不严谨造成的,问题出现在sql语句上,而起决定
谢了,下面的各位,原来的问题解决了,现在有个小问题不知道如何解决如果是&符号的话,传到文本框时,会变成 &如何解决?效果如下已经解决了。。。把inner