避免SQL注入
SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。
而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。
SQL注入实例
很多Web开发者没有意识到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="登陆" / /p /form
我们的处理里面的SQL可能是这样的:
String username = "jack"; String password = "123456"; String sql = "select * from user where username = " + username + " and password = " + password + "";
如果用户的输入的用户名如下,密码任意
myuser or foo = foo --
那么我们的SQL变成了如下所示:
select * from user where username =myuser or foo==foo -- and password=xxx
在SQL里面--是注释标记,所以查询语句会在此中断。这就让攻击者在不知道任何合法用户名和密码的情况下成功登录了。
对于MSSQL还有更加危险的一种SQL注入,就是控制系统,下面这个可怕的例子将演示如何在某些版本的MSSQL数据库上执行系统命令。
String sql = "SELECT * FROM products WHERE name LIKE %"+prod+"%" //execute sql
如果攻击提交
a% exec master..xp_cmdshell net user test testpass /ADD --
作为变量 prod的值,那么sql将会变成
String sql ="SELECT * FROM products WHERE name LIKE %a% exec master..xp_cmdshell net user test testpass /ADD--%"
MSSQL服务器会执行这条SQL语句,包括它后面那个用于向系统添加新用户的命令。如果这个程序是以sa运行而 MSSQLSERVER服务又有足够的权限的话,攻击者就可以获得一个系统帐号来访问主机了。
虽然以上的例子是针对某一特定的数据库系统的,但是这并不代表不能对其它数据库系统实施类似的攻击。针对这种安全漏洞,只要使用不同方法,各种数据库都有可能遭殃。
如何预防SQL注入
也许你会说攻击者要知道数据库结构的信息才能实施SQL注入攻击。确实如此,但没人能保证攻击者一定拿不到这些信息,一旦他们拿到了,数据库就存在泄露的危险。如果你在用开放源代码的软件包来访问数据库,比如论坛程序,攻击者就很容易得到相关的代码。如果这些代码设计不良的话,风险就更大了。目前Discuz、phpwind、phpcms等这些流行的开源程序都有被SQL注入攻击的先例。
这些攻击总是发生在安全性不高的代码上。所以,永远不要信任外界输入的数据,特别是来自于用户的数据,包括选择框、表单隐藏域和 cookie。就如上面的第一个例子那样,就算是正常的查询也有可能造成灾难。
SQL注入攻击的危害这么大,那么该如何来防治呢?下面这些建议或许对防治SQL注入有一定的帮助。
严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害。
检查输入的数据是否具有所期望的数据格式,严格限制变量的类型,例如使用regexp包进行一些匹配处理,或者使用strconv包对字符串转化成其他基本类型的数据进行判断。
所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,即不要直接拼接SQL语句。例如使用database/sql里面的查询函数Prepare和Query,或者Exec(query string, args ...interface{})。
在应用发布之前建议使用专业的SQL注入检测工具进行检测,以及时修补被发现的SQL注入漏洞。网上有很多这方面的开源工具,例如sqlmap、SQLninja等。
避免网站打印出SQL错误信息,比如类型错误、字段不匹配等,把代码里的SQL语句暴露出来,以防止攻击者利用这些错误信息进行SQL注入。
总结
通过上面的示例我们可以知道,SQL注入是危害相当大的安全漏洞。所以对于我们平常编写的Web应用,应该对于每一个小细节都要非常重视,细节决定命运,生活如此,编写Web应用也是这样。
MySQL数据库安全性考虑:预防SQL注入漏洞 随着互联网的快速发展,数据库成为了现代应用程序中的重要组成部分。而在数据库的使用过程中,安全性一直是一个重要的关注点。SQL注入漏洞(SQL Injection)是一种常见的数据库安全漏洞,攻击者可以通过在应用程序的用户输入参数中注入恶意的SQL代码,从而获得对数据库的未授权访问权限。为了保护MySQL数据库免受SQL注入漏洞的威胁,以下是一些预防SQL注入漏洞的安全性考虑。
第十二届 BigData NoSQL Meetup — 基于hbase的New sql落地实践 立即下载
相关文章
- .net 温故知新:【7】IOC控制反转,DI依赖注入
- Bert不完全手册7. 为Bert注入知识的力量 Baidu-ERNIE & THU-ERNIE & KBert
- 从一个ctf简单总结下mysql手工注入
- 代码审计 | SQL 注入
- CVE-2022-28346:Django SQL注入漏洞
- Mybatis中SQL注入攻击的3种方式,真是防不胜防!
- 零基础学SQL注入必练靶场之SQLiLabs(搭建+打靶)
- MySql基础-笔记12 -重复数据处理、SQL注入、导入导出数据
- 踩坑篇之WebSocket实现类中无法使用@Autowired注入对象
- SQL开发知识:一个简单的sql注入
- spring的依赖注入DI详解编程语言
- 警惕Linux SQL注入安全风险(linuxsql注入)
- MySQL 跟踪SQL痕迹:如何调试查询问题(mysql跟踪sql)
- SQL到Oracle的数据迁移之路(sql转换oracle)
- MySQL4防止SQL注入的策略(mysql4注入)
- 手把手教你如何向Andoird应用中注入Metasploit载荷
- MySQL 嵌入式 SQL 的特点和应用场景分析(mysql嵌入式sql)
- SQL与Oracle在数据库中的区别(sql和oracle区别)
- Oracle表空间管理:精通SQL(oracle表空间sql)
- SQL注入攻击?(mysql如何防止)
- 如何防范SQL注入攻击:MySQL的几种安全策略(sql注入mysql)
- SQL注入攻击对MSSQL的威胁及防护策略(sql注入 mssql)
- Oracle SQL 手册:帮助你轻松上手(oracle sql手册)
- MSSQL实现SQL注入防护的完美解决方案(mssql 防sql注入)
- MSSQL注入攻击:万忌莫及!(mssql注入简书)
- MySQL中防御SQL注入攻击的方法(mysql中sql注入)
- 语句Oracle推出新SQL语句 助你工作更高效(oracle会新增sql)
- Oracle中SQl实现相减运算(oracle中sql相减)
- Oracle SQL序列有效自动增长及控制ID(oracle sql序列)
- Sql学习第一天——SQL练习题(建表/sql语句)
- JSP获取Spring注入对象示例
- C#使用带like的sql语句时防sql注入的方法