前言 第一个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