防御篇
要保护 Web 应用不受攻击,我们需要采取一些措施来防御攻击。以下是一些常见的 Web 开发安全防御技巧。
1. XSS 的防御
- 永远不信任用户的提交内容
- 不要将用户提交内容直接转换成DOM
-
现成工具
-
前端:
- 主流框架(React、Vue等)默认防御XSS
- google-closure-library
-
服务端(Node)
- DOMPurify
-
2. 防御 CSRF 的正确姿势
-
验证 HTTP Referer 字段
Referer 字段中记录了该HTTP请求的来源地址,如果不正确,则有可能是CSRF攻击,拒绝该请求。 -
在请求地址中添加 token 并验证
在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。 -
在 HTTP 头中自定义属性并验证
这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。
3. 防御 DoS
Dos攻击
- 定期扫描
- 在骨干节点配置防火墙
- 用足够的机器承受黑客攻击
- 充分利用网络设备保护网络资源
- 过滤不必要的服务和端口
- 检查访问者的来源
- 过滤所有 RFC1918 IP地址
- 限制SYN/ICMP流量
DDos攻击
使用高防服务器、高防CDN、高防IP
注意:DDos攻击只能被减弱,无法被彻底消除。
4. 防御 Injection
-
使用 prepared statement
-
严格检查输入变量的类型和格式对于整数参数,加判断条件:不能为空、参数类型必须为数字对于字符串参数,可以使用正则表达式进行过滤:如:必须为[0-9][a-z][A-Z]范围内的字符串
-
过滤和转义特殊字符在 username 这个变量前进行转义,对'、"、等特殊字符进行转义
-
利用 mysql 的预编译机制,找到项目中查询 SQL 的地方
5. 防御中间人
6. SSRF攻击
1、过滤返回的信息,如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2、统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态。
3、限制请求的端口,比如80,443,8080,8090。
4、禁止不常用的协议,仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp://等引起的问题。 5、使用DNS缓存或者Host白名单的方式。