何谓SQL注入,这个漫画告诉你!

何谓SQL注入,这个漫画告诉你!

首先,让我们看一幅有趣的漫画:

何谓SQL注入,这个漫画告诉你!

今天我们将讨论SQL注入。

何谓SQL注入?

SQL注入是一种非常常见的数据库攻击方法。SQL注入漏洞也是网络世界中最常见的漏洞之一。每个人都可能听说过某某高年级学生通过攻击学校数据库来修改分数。这些老年人通常使用SQL注入法。

SQL注入实际上是一个过程,在这个过程中,恶意用户通过在表单中填写包含SQL关键字的数据,使数据库执行非常规代码。简而言之,这是数据“接管”的事情,只能由代码来完成。这个问题的根源是,SQL数据库操作是通过SQL语句执行的,执行代码和数据项都必须用SQL语句编写,这导致如果我们添加一些SQL语句关键字(如SELECT、DROP等)。)对于数据项,这些关键字可能在数据库写入或读取数据时执行。

说太多是没有用的。让我们来谈谈真实的案例。让我们首先使用SQLite创建一个学生文件表。

SQL数据库操作示例

单击“运行”按钮打印当前表格的内容。在上面的程序中,我们建立了一个test.db数据库和一个学生数据表,并在表中写入了四条学生信息。

那SQL注入呢?我们试图插入另一段恶意数据,其内容是漫画中的“罗伯特”。辍学学生;-看看会发生什么。

SQL数据库注入示例

运行后,您会发现程序不会输出任何数据内容,但会返回一条错误消息:找不到表单学生!

这是为什么?问题是我们插入的数据项包含了SQL关键字DROP TABLE。这两个关键字的意思是从数据库中清除一个表单。和罗伯特’),在关键字之前;SQL执行器认为前面的命令已经结束,因此执行了危险的命令DROP TABLE。换句话说,这个包含DROP TABLE关键字的数据项构成了简单插入名称信息的原始SQL语句。

conn=sqlite3 .连接(“测试数据库)#插入包含注入代码的信息名字=”罗伯特”);dropTablesStudents-‘ query=’ insertintoStudents(name)VALUES(“% s”)“%(name)conn .执行脚本(query)#检视已有的学生信息光标=conn.execute(‘SELECTid,namefromstudents ‘)打印(“IdName”)用于行内部排序器:打印({0}{1}).格式(行[0,行[1]).关闭()

更改为包含另一个命令的语句,以同时清除表单

并且在SQL数据库执行上述操作后,学生表单被清除,因此表单无法找到,所有数据项都丢失。

如何防止SQL注入问题

那么,如何防止SQL注入呢?

每个人都可能认为注入问题是由在数据项中执行SQL关键字引起的。因此,只需检查数据项中是否存在SQL关键字。事实上,许多数据库管理系统采用这种看似“方便快捷”的过滤方法,但这不是一个根本的解决方案。如果一个美国人真的被称为“弃桌”呢?你不能强迫人们改名字。

有许多合理的保护方法。首先,尽量避免使用常见的数据库名称和数据库结构。在上述情况下,如果表单的名称不是学生,则注入的代码将在执行过程中报告错误,并且不会发生数据丢失。——SQL注射液并不像你想象的那么简单。它要求攻击者对数据库的结构有足够的了解,然后才能成功。因此,在构建数据库时使用更复杂的结构和命名方法将大大降低被成功攻击的可能性。

使用字符串过滤方法(如正则表达式)来限制数据项的格式和字符数也是一种很好的保护措施。理论上,只要数据项中避免使用引号和分号等特殊字符,就可以在很大程度上避免注入SQL。

此外,各种程序文档推荐的数据库操作方法用于对数据项执行查询和写操作。例如,在上面的例子中,如果我们稍微修改它,我们首先使用execute()方法来确保一次只能执行一条语句,然后以参数的形式将数据项从SQL执行语句中分离出来,这样就完全避免了SQL注入的问题。如下所示:

SQL数据库反注入示例

conn=SQLite 3 . connect(‘ test . db ‘)#以安全的方式插入包含注入代码的信息名称=’罗伯特’);DROPTABLEstudents-‘查询=’插入学生(姓名)值(?)’ conn.execute(查询,[名称])#查看现有学生信息光标=conn.execute(‘从学生中选择id,名称’)打印(‘ idname ‘)以供浏览者:打印(“{0} {1}”。格式(行[0,行[1])conn . close()

对于PHP,SQL关键字可以通过mysql_real_escape_string等方法进行转义。如有必要,检查数据项是否安全,以防止注入SQL。当然,同时备份数据库和加密敏感内容总是最重要的。有些安全问题可能永远不会有完美的解决方案。只有采取最基本的保护措施,我们才能解决问题,确保损失最小。

 

极牛网精选文章《何谓SQL注入,这个漫画告诉你!》文中所述为作者独立观点,不代表极牛网立场。如若转载请注明出处:https://geeknb.com/4554.html

(34)
打赏 微信公众号 微信公众号 微信小程序 微信小程序
主编的头像主编认证作者
上一篇 2019年11月28日 上午8:03
下一篇 2019年11月28日 上午9:04

相关推荐

发表回复

登录后才能评论
扫码关注
扫码关注
分享本页
返回顶部