一.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. Host x.x.x.x not found in /root/.ssh/known_hosts

    候解决办法是,只要找到电脑里“.ssh” 文件夹,将文件夹里的文件”known_hosts”删除掉或者担心删除了会有风险,改个名字,然后在重新提交的时候,就能正确提交了 将known_hosts删掉或 ...

  2. SQL SERVER 数据库安装完毕之后如何修改数据库实例排序规则

    背景 最近我们在azure portal 上开了几台英文版的数据库服务器,因默认是开启就安装好对应的数据库,所以存在一个实例排序规则的问题,需把整个实例都调整成Chinese_PRC_CI_AS,避免 ...

  3. ANSI C遍历二维数组指针地址

    #include <stdio.h> int main() { ][] = {,,,}; //等价于{{1,2},{3,4}}; ; i < ; i++) { ; j < ; ...

  4. MongoDB数据库数据清理

    清理MongoDB集群数据: 1.登录MongoDB集群(mongos): # mongo -u username -p password --authenticationDatabase admin ...

  5. delphi中and和or的特殊用法

    1=1 10=2 100=4 1000=8 1 or 2 = 3(11); 1 and 3 = 1; 2 and 3 = 2; 2 or 4 = 6(110); 2 and 6 = 2; 4 and ...

  6. mac 安装photoshop + 破解

    项目开发中毫无疑问会用到图片,一般情况都是UI将图片切好的,只是,有时候项目中少了一张图片或者是改变图片的尺寸之类的问题,这里我们就不需要每次都找UI要图片了,作为程序员这些基础工具的使用,咱们还是要 ...

  7. SpringCloud(一):SpringCould 框架预览

    前言 SpringCloud是基于SpringBoot的一整套实现微服务的框架.他提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管 ...

  8. pickle.dump()和pickle.load()

    python的pickle模块实现了基本的数据序列和反序列化. 通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储: 通过pickle模块的反序列化操作,我们能够从 ...

  9. 【VS开发】设备控制台 (DevCon.exe) 示例

    设备控制台 (DevCon.exe) 示例 本部分提供以下设备控制台 (DevCon.exe) 命令的示例: DevCon HwIDs 示例 1:查找所有硬件 ID 示例 2:使用模式查找硬件 ID ...

  10. jenkins pipline 和 jenkinsfile

    Jenkins Pipeline(或简称为 "Pipeline")是一套插件,将持续交付的实现和实施集成到 Jenkins 中.Jenkins Pipeline 提供了一套可扩展的 ...