手记

常见的web安全问题总结

用户利用输入输出攻击
过滤内容:
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验证上传文件类型
  • 使用黑名单限制上传文件类型
  • 文件名/存储目录名可自定义
  • 文件名中特殊字符处理不当
1人推荐
随时随地看视频
慕课网APP