一.Web 安全常见攻击手段

  XSS(跨站脚本攻击)

  SQL 注入

  CSRF(跨站请求伪造)

  上传漏洞

  DDoS(分布式拒绝服务攻击)等

二.攻击手段原理及解决方案

  1.XSS攻击

    原理:XSS 攻击是页面被注入了恶意的代码,而浏览器执行了恶意的代码。

    分类:反射型XSS,DOM型XSS,以及存储型XSS

    简单案例

      新建一个Spring Boot项目,添加Thymeleaf模块和web模块,编写两个非常简单的html如下图

      

      

      再编写一个控制器

@Controller
public class Mycontroller {
@RequestMapping("/test1")
public String test1(){
return "test1";
}
@RequestMapping("/test2")
public String test2(){
return "test2";
}
@RequestMapping("/testServlet")
public String myServlet(HttpServletRequest request , HttpServletResponse response){
String str = request.getParameter("name");
request.setAttribute("name",str);
try {
request.getRequestDispatcher("test2").forward(request,response);
} catch (Exception e) {
e.printStackTrace();
}
return "test2";
}

      用火狐浏览器打开(注意:谷歌浏览器默认禁止了script提交,会将网页拦截)

      

      点击提交后,页面弹出了弹出框,而没有在页面中显示数据

      

    危害

      上面案例只是测试,在实际中,恶意的XSS攻击往往还会:

        窃取客户端Cookies或进行钓鱼欺骗

        控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力

        盗窃企业重要的具有商业价值的资料

        强制发送电子邮件

        控制受害者机器向其它网站发起攻击等

    解决方案

      1.对用户输入的信息进行处理,将HTML代码进行转义等。例如模板引擎自带的转义,将上述test2页面中

th:utext="${name}"

      改为

th:text="${name}"

      或者使用commons-lang的jar包里带有的StringEscapeUtils方法。

      甚至可以自己编写一个工具类,例如

//html标签转义成自定义字符
function htmlEscape(sHtml) {
return sHtml.replace(/[<>&"]/g,function(c){
return {'<':'&lt;','>':'&gt;','&':'&amp;','"':'&quot;'}[c];
});
}

      2.使用 UTF-8 为默认的字符编码以及设置 content 为 text/html 等。

      3.对重要的cookie设置httpOnly, 防止客户端通过document.cookie读取cookie。

      4.创建参数拦截filter类过滤器,对每次的请求拦截,将数据转义后再进数据库中。

      ......

  2.SQL注入

    原理:将一些特殊的参数输入到后台,而这些输入大都是SQL语法里的一些组合,执行这些恶意的输入会导致非法数据侵入数据库或取出非法的数据。

    案例:select count(1) from test where id = xxx or 1 = 1  本来只需要统计id为xxx的数据的个数,但是后面的1 = 1永远为true,导致该查询语句会查询所有的id。

    危害

      数据库信息泄漏:数据库中存放的用户的隐私信息的泄露

      网页篡改:通过操作数据库对特定网页进行篡改

      网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击

      数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改

      服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统

      破坏硬盘数据,瘫痪全系统等

    解决方案

      1.检查用户输入的合法性,尽量的限制用户输入特殊的符号,确信输入的内容只包含合法的数据。

      2.使用过滤(对关键字符进行转义)与编码统一,并使用参数化的sql语句。

      3.使用预编译等较安全的方式,例如PreparedStatement。

      4.使用加密方式加密输入的数据,使加密后的数据与数据库中的数据进行比较。

  3.CSRF攻击

    原理:(用如下案例解释)

      1. 用户打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

      2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

      3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

      4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问网站A;

      5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户的Cookie信息和权限处理该请求,导致来自网站B的恶意代码被执行。

    解决方案:(这里有多个方案)

      方案一.验证 HTTP Referer 字段

        根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址,若来源地址的不对,则拒绝请求。(这种方式存在一些问题,详情可以参考IBM中对CSRF的一些描述,具体链接

      方案二.使用验证码

        每一个重要的post提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账是使用的手机验证码。

      方案三.在请求地址中添加 token 并验证

        CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

      方案四.在 HTTP 头中自定义属性并验证

        这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

      上面各种解决方案各有优势,也都有各自的缺陷。因此,实际情况中应选择最合适的策略,这样才能把 CSRF 的危害降到最低。

  4.文件上传漏洞

    原理:Web程序没有对上传文件的格式进行严格过滤 , 还有一部分是攻击者通过 Web服务器的解析漏洞来突破Web应用程序的防护,导致恶意的可执行的脚本文件(病毒、木马等)被上传,并获得了执行服务端命令的权限。

    案例:这里我看了他人的一遍博客https://www.cnblogs.com/yuxiaole/p/9293472.html,非常简单直观。

    危害:攻击者甚至能够获取服务端的部分控制权,危害非常大。

    解决方案

      1.在前端和后台都要限制文件上传类型,例如在前端中做如下限制

#前端脚本检测,只允许上传 .jpg格式的文件
<script type="text/javascript">
function selectFile(fnUpload) {
var filename = fnUpload.value;
var mime = filename.toLowerCase().substr(filename.lastIndexOf("."));
if(mime!=".jpg")
{
alert("请选择jpg格式的照片上传");
fnUpload.outerHTML=fnUpload.outerHTML;
}
}
</script>

      2.对上传的文件在服务器上存储时进行重命名

      3.检查上传文件的类型和大小

      4.上传文件要保存的文件名和目录名由系统根据时间生成,不允许用户自定义,并且文件权限应该定义好

  5.DDoS攻击

    原理:借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,由于每个计算机中的程序都将通过向目标发送请求并要获取响应,过多的请求可能会导致目标服务器或网络溢出容量,从而导致对其他正常流量的拒绝服务。

    解决方案

      1.部署负载均衡

      2.尽量避免 NAT 的使用

      3.充足的网络带宽保证

      4.把网站做成静态页面

      5.做备份网站

      6.配置硬件防火墙等

      ......

互联网安全架构之常见的Web攻击手段及解决办法的更多相关文章

  1. 常见的Web攻击手段,拿捏了!

    大家好,我是小菜. 一个希望能够成为 吹着牛X谈架构 的男人!如果你也想成为我想成为的人,不然点个关注做个伴,让小菜不再孤单! 本文主要介绍 互联网中常见的 Web 攻击手段 如有需要,可以参考 如有 ...

  2. 安全|常见的Web攻击手段之CSRF攻击

    对于常规的Web攻击手段,如XSS.CRSF.SQL注入.(常规的不包括文件上传漏洞.DDoS攻击)等,防范措施相对来说比较容易,对症下药即可,比如XSS的防范需要转义掉输入的尖括号,防止CRSF攻击 ...

  3. 常见的web攻击手段

    XSS:跨站脚本攻击 -典型实例为: 当用户在表达输入一段数据后,提交给服务端进行持久化.如果此用户输入的是一段脚本语言,而服务端 用户输入的数据没有经过转码.校验等就存入了数据库,在其他页面需要展示 ...

  4. 常见的web攻击手段总结

    xxs攻击(跨站脚本攻击) 攻击者在网页中嵌入恶意脚本程序,当用户打开该网页时脚本程序便在浏览器上执行,盗取客户端的cookie.用户名密码.下载执行病毒木马程 序 解决: 我们可以对用户输入的数据进 ...

  5. 简单总结几种常见web攻击手段及其防御方式

    web攻击手段有几种,本文简单介绍几种常见的攻击手段及其防御方式 XSS(跨站脚本攻击) CSRF(跨站请求伪造) SQL注入 DDOS XSS 概念 全称是跨站脚本攻击(Cross Site Scr ...

  6. 简单地总结几种常见web攻击手段及其防御方式

    web攻击手段有几种,本文简单介绍几种常见的攻击手段及其防御方式 XSS(跨站脚本攻击) CSRF(跨站请求伪造) SQL注入 DDOS XSS 概念 全称是跨站脚本攻击(Cross Site Scr ...

  7. 几种常见web攻击手段及其防御方式

    XSS(跨站脚本攻击) CSRF(跨站请求伪造) SQL注入 DDOS web安全系列目录 总结几种常见web攻击手段极其防御方式 总结几种常见的安全算法 XSS 概念 全称是跨站脚本攻击(Cross ...

  8. 总结几种常见web攻击手段及其防御方式

    本文简单介绍几种常见的攻击手段及其防御方式 XSS(跨站脚本攻击) CSRF(跨站请求伪造) SQL注入 DDOS web安全系列目录 总结几种常见web攻击手段极其防御方式 总结几种常见的安全算法 ...

  9. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

随机推荐

  1. 打开App显示文件已损坏,打不开,您应该将它移到废纸篓,怎么办?

    1. 首先确保系统安全设置已经改为任何来源 sudo spctl --master-disable 2. 打开任何来源后,到应用程序目录中尝试运行软件,如果仍提示损坏,请在应用图标上,鼠标右键,在弹出 ...

  2. Failed to start LSB: start and stop MariaDB

    Failed to start LSB: start and stop MariaDB */--> Failed to start LSB: start and stop MariaDB Tab ...

  3. Django之模型的高级用法

    from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) a ...

  4. 机器学习之SVM算法

    1.知识点 """ SVM,也称支持向量机:其优化核心为求取点到平面的距离最大化,主要是解决二分类问题 y = wx+b ,且 yi * y(i) >0 恒成立 思 ...

  5. Nginx OCSP

    #开启 vim  /path/to/path/conf/nginx.conf ..... events{ ...... 省略..... } http { ..... server{ listen 44 ...

  6. The inherit, initial, and unset values

    The  inherit, initial, and unset keywords are special values you can give to any CSS property. Tests ...

  7. centos 7安装python3及相关模块

    一.python3安装 1.cd /usr/bin 2.mv python python.bak 3.https://www.python.org/ftp/python/网站选择合适的版本 4.wge ...

  8. pyQt点击事件和数据传输

    首先是PushButton点击事件,点击按钮之后发送textEdit框里输入的文字到后台. def retranslateUi(self, MainWindow): _translate = QtCo ...

  9. 串口使用和CSerial类

    1 串口通信的基本原理 串口通信中无论是写入串口还是读取串口,都是对缓冲区操作的.可以理解为写串口就是向输出缓冲区写入内容,读取串口就是从输入串口缓冲区读取内容.但是何时打开串口,何时发送数据,何时接 ...

  10. Java ——类型转换 向args传递参数

    本节重点思维导图  自动类型转换 整型.实型(常量).字符型数据可以混合运算 运算中,不同类型的数据先转化为同一类型,然后进行运算 转换从低级到高级 低 ----------------------- ...