前言
第一个Web漏洞是sql。无论使用哪种语言进行Web后端开发,只要使用关系数据库,就可能会遇到SQL注入攻击。
那么如何在Python Web开发过程中进行sql注入,以及如何解决这个问题呢?
我不想...

前言
第一个Web漏洞是sql。无论使用哪种语言进行Web后端开发,只要使用关系数据库,就可能会遇到SQL注入攻击。
那么如何在Python Web开发过程中进行sql注入,以及如何解决这个问题呢?
我不想讨论其他语言如何避免sql注入。互联网上有各种PHP反注入方法。 Python方法类似。在这里,我将举一个例子。
原因
漏洞最常见的原因是字符串拼接。
当然,sql注入不仅仅是一种拼接的情况,还有很多种宽字节注入,特殊字符转义等。这是最常见的字符串拼接,这是初级程序员最常见的错误。
首先我们定义一个类来处理mysql的操作:

这门课有问题吗?
答案是:是的!
这个类是有缺陷的,很容易引起sql注入,让我们来谈谈它为什么会生成SQL注入。
为了验证问题的真实性,这里有一种方法可以在上面的类中调用该方法,如果发生错误,它将直接抛出异常。

这个方法很简单:
最常见的select查询语句之一,也使用最简单的字符串连接来形成SQL语句。很明显,可以控制传入参数testUrl。要执行注入测试,您只需要在testUrl的值之后添加单引号。执行sql注入测试。
这并不多说,必须有一个注入漏洞,脚本再次运行,看到结果:
(1064,'你的SQL语法有错误;请查看与你的MariaDB服务器版本相对应的手册,以便在第1行''t.tips'''附近使用正确的语法')
回声报告错误,非常熟悉的错误,这里我传递的测试参数是:
T.tips'
我们来谈谈导致注射的情况。稍微修改上面的方法:

此方法不直接使用字符串拼接,而是使用%s而不是传递参数。它看起来非常像预编译的sql吗?
这种写法可以阻止sql注入吗?经过测试,您将知道回声如下:
(1064,'你的SQL语法有错误;请查看与你的MariaDB服务器版本相对应的手册,以便在第1行''t.tips'''附近使用正确的语法')
与上面的测试结果相同,所以这个方法是不可接受的,而且这个方法没有预编译sql语句,那么如何防止sql注入?
解决
两种选择
1.编码并转义传入的参数
2.使用Python的MySQLdb模块附带一个方法
第一种方案实际上是在许多PHP反注入方法中使用来转义或过滤特殊字符。
第二个选项是使用内部方法,类似于PHP中的PDO,在这里您可以简单地修改上面的数据库类。
修改后的代码
Failure when receiving data from the peer