文章插图
SQL注入简介
SQL 注入漏洞(SQL Injection)是 Web 开发中最常见的一种安全漏洞 。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限 。
而造成 SQL 注入的原因是因为程序没有有效的转义过滤用户的输入,使攻击者成功的向服务器提交恶意的 SQL 查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码 。
很多 Web 开发者没有意识到 SQL 查询是可以被篡改的,从而把 SQL 查询当作可信任的命令 。殊不知,SQL 查询是可以绕开访问控制,从而绕过身份验证和权限检查的 。更有甚者,有可能通过 SQL 查询去运行主机系统级的命令 。
SQL 注入原理
下面将通过一些真实的例子来详细讲解 SQL 注入的方式的原理 。
考虑以下简单的管理员登录表单:
<form action="/login" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" value=https://www.isolves.com/it/cxkf/yy/php/2019-10-14/"登陆" />
</form>
后端的 SQL 语句可能是如下这样的:
let querySQL = `
SELECT *
FROM user
WHERE username='${username}'
AND psw='${password}'
`;
// 接下来就是执行 sql 语句
目的就是来验证用户名和密码是不是正确,按理说乍一看上面的 SQL 语句也没什么毛病,确实是能够达到我们的目的,可是你只是站在用户会老老实实按照你的设计来输入的角度来看问题,如果有一个恶意攻击者输入的用户名是 zhangsan’ OR 1 = 1 --,密码随意输入,就可以直接登入系统了 。
冷静下来思考一下,我们之前预想的真实 SQL 语句是:
SELECT * FROM user WHERE username='zhangsan' AND psw='mypassword'
可以恶意攻击者的奇怪用户名将你的 SQL 语句变成了如下形式:
SELECT * FROM user WHERE username='zhangsan' OR 1 = 1 --' AND psw='xxxx'
在 SQL 中,-- 是注释后面的内容的意思,所以查询语句就变成了:
SELECT * FROM user WHERE username='zhangsan' OR 1 = 1
这条 SQL 语句的查询条件永远为真,所以意思就是恶意攻击者不用我的密码,就可以登录进我的账号,然后可以在里面为所欲为,然而这还只是最简单的注入,牛逼的 SQL 注入高手甚至可以通过 SQL 查询去运行主机系统级的命令,将你主机里的内容一览无余,这里我也没有这个能力讲解的太深入,毕竟不是专业研究这类攻击的,但是通过以上的例子,已经了解了 SQL 注入的原理,我们基本已经能找到防御 SQL 注入的方案了 。
相关推荐:《Thinkphp教程》
预防 SQL 注入
防止 SQL 注入主要是不能允许用户输入的内容影响正常的 SQL 语句的逻辑,当用户的输入的信息将要用来拼接 SQL 语句的话,我们应该永远选择不相信,任何内容都必须进行转义过滤,当然做到这个还是不够的,下面列出防御 SQL 注入的几点注意事项:
1、严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害 。
2、后端代码检查输入的数据是否符合预期,严格限制变量的类型,例如使用正则表达式进行一些匹配处理 。
3、对进入数据库的特殊字符(’,",,<,>,&,*,; 等)进行转义处理,或编码转换 。基本上所有的后端语言都有对字符串进行转义处理的方法,比如 lodash 的 lodash._escapehtmlchar 库 。
4、所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中,即不要直接拼接 SQL 语句 。例如 Node.js 中的 MySQLjs 库的 query 方法中的 ? 占位参数 。
mysql.query(`SELECT * FROM user WHERE username = ? AND psw = ?`, [username, psw]);
5、在应用发布之前建议使用专业的 SQL 注入检测工具进行检测,以及时修补被发现的 SQL 注入漏洞 。网上有很多这方面的开源工具,例如 sqlmap、SQLninja 等 。
6、避免网站打印出 SQL 错误信息,比如类型错误、字段不匹配等,把代码里的 SQL 语句暴露出来,以防止攻击者利用这些错误信息进行 SQL 注入 。
推荐阅读
- HTTPS性能优化原理与实践——如何优化HTTPS
- Oracle数据库之如何快速查找未使用绑定变量的SQL语句
- 宝宝不吸乳头如何处理
- 为何淘宝违规商品举报不了 淘宝上如何投诉侵权
- 更年期女性如何喝茶更健康
- 为什么喉咙痛完第二天就感冒,如何判断得了什么类型的感冒
- 如何区别春茶与夏秋茶 你会吗
- 中国茶的历史,陆羽如何将儒释道精神融合入茶经
- 穷人如何幸福? 穷人的幸福
- 如何写劳动仲裁申请?快,纯干货,你可能暂不需要,但先收藏