安全设计原则:数据与代码分离。
注入攻击的本质:把用户的输入数据当作代码来执行。
关键条件:
- 用户能够控制输入。
- 程序要执行的代码拼接了用户输入的数据。
1 SQL 注入
1.1 概述
因为 98 年黑客杂志的一篇文章, SQL 注入第一次为人熟知。
var sql="select * from area where city ='" + city +"'";
正常场景(传入 Shanghai),执行的 SQL 语句:
select * from area where city = 'Shanghai';
黑客传入有语义的参数:
Shanghai'; drop table area--
这时,执行的 SQL 语句为:
select * from area where city = 'Shanghai'; drop table area--
这样的话,查询语句执行后,相应的表也被恶意删除了!
1.2 防御误区
使用那些基于黑名单的方法,比如过滤字符。存在如下问题:
方法 | 攻击 |
---|---|
过滤空格 |
select/**/city/**/from/**/area 或 select(city)from(area)
|
过滤括号与引号 | 0x61646D696E |
过滤 SQL 保留字 | having、order by 可能出现在自然语言中,会造成误杀。 |
1.3 有效防御
1、预编译语句
这是防御 SQL 注入攻击的最佳方法,因为输入的参数不会改变 SQL 语句的语义。
2、存储过程
使用存储过程的效果与预编译语句相似。但应该尽量避免在内部动态生成 SQL 语句。
如果某些场合,无法使用预编译语句或存储过程,那么可以考虑以下方法:
3、检查数据类型
检查数据类型可以在一定程度上对抗注入攻击。但不是万能的,比如字符串类型,就需要依赖其他防御方法。
4、安全函数
5.数据库
最小权限原则:Web 应用应该避免使用 root 等最高权限账户(因为这些账户可以创建自定义函数、操作本地文件权限)。
2 其它类型注入
它们的相同特点:都是违反了数据与代码分离。
2.1 XML 注入
注入方式上与 HTML 类似。
2.2 代码注入
都是由一些不安全的函数或者方法引起的。
比如 js 的 eval()
。eval()
函数可计算某个字符串,并执行其中的的 JavaScript 代码。
在 Java 中可以利用脚本引擎实施 js 代码注入。
安全设计原则:数据与代码分离。
网友评论