反引号注入_什么是 SQL 注入?
(给ImportNew加星标,提高Java技能)
转自:Java程序员联盟
文章目录:
何谓SQL注入?
SQL数据库操作示例
SQL数据库注入示例
如何防止SQL注入问题
SQL数据库反注入示例
何谓SQL注入?
SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。
SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据「越俎代庖」做了代码才能干的事情。这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。
多言无益,我们拿真实的案例来说话。下面我们先使用SQLite建立一个学生档案表。
SQL数据库操作示例
import sqlite3
# 连接数据库conn = sqlite3.connect('test.db')
# 建立新的数据表conn.executescript('''DROP TABLE IF EXISTS students; CREATE TABLE students (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL);''')
# 插入学生信息students = ['Paul','Tom','Tracy','Lily']
for name in students: query = "INSERT INTO students (name) VALUES ('%s')" % (name) conn.executescript(query);
# 检视已有的学生信息cursor = conn.execute("SELECT id, name from students")print('IDName')for row in cursor: print('{0}{1}'.format(row[0], row[1]))
conn.close()
点击运行按钮将会打印目前表中的内容。上述程序中我们建立了一个test.db数据库以及一个students数据表,并向表中写入了四条学生信息。
那么SQL注入又是怎么一回事呢?我们尝试再插入一条恶意数据,数据内容就是漫画中的"Robert');DROP TABLE students;--",看看会发生什么情况。
SQL数据库注入示例
conn = sqlite3.connect('test.db')
# 插入包含注入代码的信息name = "Robert');DROP TABLE students;--"query = "INSERT INTO students (name) VALUES ('%s')" % (name)
conn.executescript(query)
# 检视已有的学生信息cursor = conn.execute("SELECT id, name from students")print('IDName')for row in cursor: print('{0}{1}'.format(row[0], row[1]))
conn.close()
你将会发现,运行后,程序没有输出任何数据内容,而是返回一条错误信息:表单students无法找到!
这是为什么呢?问题就在于我们所插入的数据项中包含SQL关键字DROP TABLE,这两个关键字的意义是从数据库中清除一个表单。而关键字之前的Robert');使得SQL执行器认为上一命令已经结束,从而使得危险指令DROP TABLE得到执行。也就是说,这段包含DROP TABLE关键字的数据项使得原有的简单的插入姓名信息的SQL语句
"INSERT INTO students (name) VALUES ('Robert')"
变为了同时包含另外一条清除表单命令的语句
"INSERT INTO students (name) VALUES ('Robert');DROP TABLE students;--"
而SQL数据库执行上述操作后,students表单被清除,因而表单无法找到,所有数据项丢失。
如何防止SQL注入问题
那么,如何防止SQL注入问题呢?
大家也许都想到了,注入问题都是因为执行了数据项中的SQL关键字,那么,只要检查数据项中是否存在SQL关键字不就可以了么?的确是这样,很多数据库管理系统都是采取了这种看似『方便快捷』的过滤手法,但是这并不是一种根本上的解决办法,如果有个美国人真的就叫做『Drop Table』呢?你总不能逼人家改名字吧。
合理的防护办法有很多。首先,尽量避免使用常见的数据库名和数据库结构。在上面的案例中,如果表单名字并不是students,则注入代码将会在执行过程中报错,也就不会发生数据丢失的情况——SQL注入并不像大家想象得那么简单,它需要攻击者本身对于数据库的结构有足够的了解才能成功,因而在构建数据库时尽量使用较为复杂的结构和命名方式将会极大地减少被成功攻击的概率。
使用正则表达式等字符串过滤手段限制数据项的格式、字符数目等也是一种很好的防护措施。理论上,只要避免数据项中存在引号、分号等特殊字符就能很大程度上避免SQL注入的发生。
另外,就是使用各类程序文档所推荐的数据库操作方式来执行数据项的查询与写入操作,比如在上述的案例中,如果我们稍加修改,首先使用execute()方法来保证每次执行仅能执行一条语句,然后将数据项以参数的方式与SQL执行语句分离开来,就可以完全避免SQL注入的问题,如下所示:
SQL数据库反注入示例
conn = sqlite3.connect('test.db')
# 以安全方式插入包含注入代码的信息name = "Robert');DROP TABLE students;--"query = "INSERT INTO students (name) VALUES (?)"
conn.execute(query, [name])
# 检视已有的学生信息cursor = conn.execute("SELECT id, name from students")print('IDName')for row in cursor: print('{0}{1}'.format(row[0], row[1]))
conn.close()
而对于PHP而言,则可以通过mysql_real_escape_string等方法对SQL关键字进行转义,必要时审查数据项目是否安全来防治SQL注入。
当然,做好数据库的备份,同时对敏感内容进行加密永远是最重要的。某些安全性问题可能永远不会有完美的解决方案,只有我们做好最基本的防护措施,才能在发生问题的时候亡羊补牢,保证最小程度的损失。
推荐阅读
(点击标题可跳转阅读)
Sql Or NoSql,看完这一篇你就都懂了
这句简单的 sql ,如何加索引?颠覆了我多年的认知
腾讯面试题:一条 SQL 语句执行得很慢的原因有哪些?
看完本文有收获?请转发分享给更多人
关注「ImportNew」,提升Java技能
好文章,我在看❤️
反引号注入_什么是 SQL 注入?相关推荐
- 搭建mysql注入_常见的sql注入环境搭建
常见的sql注入环境搭建 By : Mirror王宇阳 Time:2020-01-06 PHP+MySQL摘要 $conn = new mysqli('数据库服务器','username','pass ...
- sql sp_password登录名不存在或 权限_什么是SQL注入攻击?怎么预防?
转自CSDN,作者hellochenlu/网易号,云计算那些事 互联网的攻击形式千万种,威胁最大的独一份,就是SQL注入了!由于它的危害之大,它也成为了每一个运维工程师为客户部署业务系统前必做的防御. ...
- 【SQL注入漏洞-01】SQL注入漏洞原理及分类
SQL注入简介 结构化查询语言(Structured Query Language,缩写︰SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言. SQL注入(SQL Injection)是一 ...
- sql注入及mybatis防止sql注入
一.Sql 注入漏洞详解 Sql 注入产生原因及威胁: 当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句.这种网站内部直接发送的Sql ...
- SQL注入-01-什么是SQL注入?
什么是SQL注入? 1.正常的web端口访问 正常访问是web传入程序设计者所希望的参数值,由程序查询数据库完成处理后,呈现结果页面给用户. 2.SQL注入是如何访问? (1)SQL注入也是正常的we ...
- java sql注入 正则表达式_Java防止SQL注入(转)
一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...
- SQL注入原理及预防SQL注入的方法
网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,担心网上的信息以及个人隐私遭到泄露.下面要为大家介绍的是SQL注入,对于sql注入,相信程序员都知道或者使用过,如果没有了解或完全没有听 ...
- sql注释符注入防御_读《SQL注入***与防御》笔记
' //单引号报错,转义 %bf%5c%27 //宽字节注入,数据库编码为GBK时,%bf%5c认为是一个字节,绕过PHP正则 UNION ALL SELECT LOAD_FILE('/etc/pas ...
- php mysql 注入一句话木马_渗透技术--SQL注入写一句话木马原理
讲一下SQL注入中写一句话拿webshell的原理,主要使用的是 SELECT ... INTO OUTFILE 这个语句,下面是一个语句的例子: SELECT * INTO OUTFILE 'C:\ ...
最新文章
- Redis将继续采用BSD许可证
- CodeForces 471C MUH and House of Cards
- YTU 2917: Shape系列-3
- 《LoadRunner性能测试巧匠训练营》——3.3 场景监控实战
- python 阿里云短信接口_阿里云短信PythonSDK的用法
- selenium的简单介绍
- md5与des算法有何不同_Python算法详解:为什么说算法是程序的灵魂?
- 一口气说出 6种 @Transactional 注解失效场景
- [CentOS7] - CentOS7设置开机启动
- 使用printf函数输出其ascii。_输入一个N*N的矩阵,将其转置后输出。要求:不得使用任何数组(就地逆置)。...
- HTML5重要知识点整理
- 开放集合目标检测任务 Open-set Detection
- Linux Ubuntu从零开始部署web环境及项目 -----部署项目 (三)
- C盘文件分析(如何减小C盘容量)
- 当年的毒王熊猫烧香,现在怎么样了?
- 获取jqGrid中每行的子元素td并修改其属性
- python大鱼吃小鱼程序代码_写一个小游戏程序(大鱼吃小鱼)
- mac 远程连接win7桌面
- 春考计算机组装维修知识点,山东春考计算机组装及维修模拟题.docx
- Max骨骼沿样条线运动——中国龙绑定相关问题