常见的Web安全攻防

 

Web安全知多少:https://www.cnblogs.com/yzycoder/p/5741507.html

转载来源:https://zoumiaojiang.com/article/common-web-security/

web即万维网,是由超文本和HTTP构造,就是我们常说的网站,那么要学习web安全,必要先要了解web的知识;

网站是由程序,空间,域名三大部分组成 

常见的攻击种类

1、SQL注入:即通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。

2、跨站脚本攻击(也称为XSS):指利用网站漏洞从用户那里恶意盗取信息。用户在浏览网站、使用即时通讯软件、甚至在阅读电子邮件时,通常会点击其中的链接。攻击者通过在链接中插入恶意代码,就能够盗取用户信息。

3、网页挂马:把一个木马程序上传到一个网站里面然后用木马生成器生一个网马,再上到空间里面,再加代码使得木马在打开网页里运行。

4、CSRF(跨站请求伪造攻击):攻击者可以盗用你的登陆信息,以你的身份模拟发送各种请求。攻击者只要借助少许的社会工程学的诡计,例如通过 QQ 等聊天软件发送的链接(有些还伪装成短域名,用户无法分辨),攻击者就能迫使 Web 应用的用户去执行攻击者预设的操作。例如,当用户登录网络银行去查看其存款余额,在他没有退出时,就点击了一个 QQ 好友发来的链接,那么该用户银行帐户中的资金就有可能被转移到攻击者指定的帐户中(即伪造请求,冒充用户在站内的正常操作)。

5、命令行注入:命令行注入漏洞,指的是攻击者能够通过 HTTP 请求直接侵入主机,执行攻击者预设的 shell 命令。

6、DDoS (分布式拒绝服务):其原理就是利用大量的请求造成资源过载,导致服务不可用,这个攻击应该不能算是安全问题,这应该算是一个另类的存在,因为这种攻击根本就是耍流氓的存在,「伤敌一千,自损八百」的行为。

预防方案

过滤内容:

  • 验证所有来源的输入
  • 验证所有输出到客户端的内容
  • 建立可信边界

过滤方法:

  • 验证数据的长度、大小、格式、类型以及内容
  • 使用服务器端代码做最终验证
  • 不使用黑名单验证数据
  • 数据非法,程序停止执行,切勿试图修正数据

XSS

非持续性XSS

  • Web 页面渲染的所有内容或者渲染的数据都必须来自于服务端。
  • 尽量不要从 URL,document.referrerdocument.forms 等这种 DOM API 中获取数据直接渲染。
  • 尽量不要使用 evalnew Function()document.write()document.writeln()window.setInterval()window.setTimeout()innerHTMLdocument.creteElement() 等可执行字符串的方法。
  • 如果做不到以上几点,也必须对涉及 DOM 渲染的方法传入的字符串参数做 escape 转义。
  • 前端渲染的时候对任何的字段都需要做 escape 转义编码。

持久性XSS

  • 后端在入库前应该选择不相信任何前端数据,将所有的字段统一进行转义处理。
  • 后端在输出给前端数据统一进行转义处理。
  • 前端在渲染页面 DOM 的时候应该选择不相信任何后端数据,任何字段都需要做转义处理。

 基于字符集的XSS

  • 记住指定 
  • XML 中不仅要指定字符集为 utf-8,而且标签要闭合

基于 Flash 的跨站 XSS 

  • 严格管理 cookie 的读写权限
  • 对 Flash 能接受用户输入的参数进行过滤 escape 转义处理

未经验证的跳转 XSS

  • 对待跳转的 URL 参数做白名单或者某种规则过滤
  • 后端注意对敏感信息的保护, 比如 cookie 使用来源验证。

预防CSRF

通过session token来实现保护。当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中,然后将Token发给客户端(一般通过构造hidden表单)。下次客户端提交请求时,Token会随着表单一起提交到服务器端。接收到请求后,服务器端会对Token值进行验证,判断是否和session中的Token值相等,若相等,则可以证明请求有效,不是伪造的。

预防SQL注入

  • 严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害
  • 后端代码检查输入的数据是否符合预期,严格限制变量的类型,例如使用正则表达式进行一些匹配处理。
  • 对进入数据库的特殊字符('"\<>&*; 等)进行转义处理,或编码转换。基本上所有的后端语言都有对字符串进行转义处理的方法,比如 lodash 的 lodash._escapehtmlchar 库。
  • 所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中,即不要直接拼接 SQL 语句。例如 Node.js 中的 mysqljs 库的 query 方法中的 ? 占位参数。
  • 在应用发布之前建议使用专业的 SQL 注入检测工具进行检测,以及时修补被发现的 SQL 注入漏洞。网上有很多这方面的开源工具,例如 sqlmap、SQLninja 等。
  • 避免网站打印出 SQL 错误信息,比如类型错误、字段不匹配等,把代码里的 SQL 语句暴露出来,以防止攻击者利用这些错误信息进行 SQL 注入。
  • 不要过于细化返回的错误信息,如果目的是方便调试,就去使用后端日志,不要在接口上过多的暴露出错信息,毕竟真正的用户不关心太多的技术细节,只要话术合理就行。

 命令行注入

  • 后端对前端提交内容需要完全选择不相信,并且对其进行规则限制(比如正则表达式)。
  • 在调用系统命令前对所有传入参数进行命令行参数转义过滤。
  • 不要直接拼接命令语句,借助一些工具做拼接、转义预处理,例如 Node.js 的 shell-escapenpm 包。

预防DDOS

网络层 DDoS 防御

网络层的 DDoS 攻击究其本质其实是无法防御的,我们能做得就是不断优化服务本身部署的网络架构,以及提升网络带宽。当然,还是做好以下几件事也是有助于缓解网络层 DDoS 攻击的冲击:

  • 网络架构上做好优化,采用负载均衡分流。
  • 确保服务器的系统文件是最新的版本,并及时更新系统补丁。
  • 添加抗 DDos 设备,进行流量清洗。
  • 限制同时打开的 SYN 半连接数目,缩短 SYN 半连接的 Timeout 时间。
  • 限制单 IP 请求频率。
  • 防火墙等防护设置禁止 ICMP 包等。
  • 严格限制对外开放的服务器的向外访问。
  • 运行端口映射程序或端口扫描程序,要认真检查特权端口和非特权端口。
  • 关闭不必要的服务。
  • 认真检查网络设备和主机/服务器系统的日志。只要日志出现漏洞或是时间变更,那这台机器就可能遭到了攻击。
  • 限制在防火墙外与网络文件共享。这样会给黑客截取系统文件的机会,主机的信息暴露给黑客,无疑是给了对方入侵的机会。
  • 加钱堆机器。。
  • 报警。。

 应用层 DDoS 防御

  • 判断 User-Agent 字段(不可靠,因为可以随意构造)
  • 针对 IP + cookie,限制访问频率(由于 cookie 可以更改,IP 可以使用代理,或者肉鸡,也不可靠)
  • 关闭服务器最大连接数等,合理配置中间件,缓解 DDoS 攻击。
  • 请求中添加验证码,比如请求中有数据库操作的时候。
  • 编写代码时,尽量实现优化,并合理使用缓存技术,减少数据库的读取操作。
  • 加钱堆机器。。
  • 报警。。

你可能感兴趣的:(Web安全)