a.验证所有来源的输入
b.验证所有输出到客户端的内容
c.建立可信边界
过滤方法:
a.验证数据的长度、大小、格式、类型以及内容
b.使用服务器端代码做最终验证
c.不使用黑名单验证数据
d.数据非法,程序停止执行,切勿试图修正数据
常见的攻击类型:
(1) sql注入
(2) XSS
(3) CSRF
(4) 文件上传
1.sql注入
由于程序中对用户输入检查不严格,用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。对于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来执行。
$query = "SELECT * FROM users WHERE username = ".$_GET["username"];
//正常情况下,这里应该生成一个sql语句 SELECT * FROM users WHERE username = XXX;
//但是,当用户的输入为 '1;DROP TABLE users;',那你的user表将会被删除;
//用以下这种方式就可以有效的防止问题的发生了
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
2.XSS
Reflected XSS (Non-persist XSS)
跨站代码一般存在于链接中,请求这样的链接时,跨站代码经过服务端反射回来,这类跨站的代码一般不存储到服务端
echo $_GET['str'];
Stored XSS (Persist XSS)
这是利用起来最方便的跨站类型,跨站代码存储于服务端(比如数据库中)
http://XXX.com/onmouseover=alert(1);?mid=&page=3
DOM based XSS
一种基于DOM的跨站,这是客户端脚本自身解析不正确导致的安全问题
防御措施:
网络层:Web应用防火墙
架构层:域名分离/Cookie加固/CSP防御
代码层:输出转义。输出的时候转义HTML代码 ’<’ => ’<’ ’>’ => ’>’ ’”’ => ’"’
3.CSRF
跨站点请求伪造,通常用来指 WEB 网站的这一类漏洞,即在某个恶意站点的页面上,促使访问者请求被攻击者的网站的某个 URL,从而达到改变服务器端数据的目的。
在页面中加入一个<img>标签,浏览器就会发送一个请求,以获取其src属性引用的值 攻击者将敏感操作的URI作为src 继承Cookie,以浏览者的身份作敏感访问并操作。
防御方法:
| 请求类型 | 重要操作不使用GET |
| 验证码 | 让用户手工输入验证码 ->影响用户体验 |
| Referer | 验证HTTP请求来源 ->容易被绕过 |
| Form token | 在表单中增加随机字符串 ->无法防御XSS漏洞引发的CSRF攻击 |
4.文件上传
存在风险:
- 允许上传可执行文件
- 使用客户端JS验证上传文件类型
- 使用黑名单限制上传文件类型
- 文件名/存储目录名可自定义
- 文件名中特殊字符处理不当