• 互联网架构安全


    XSS攻击

    XSS其实就是使用js脚本语言攻击。

    XSS攻击场景
    A请求提交表单信息,表单信息转发到另- -个页面展示。
    有一些钓鱼网站,在提交参数的后面带上XSS攻击的js脚本

    有一些钓鱼网站,在提交参数的时候后面带上XSS脚本攻击举例子
    http:/ /pay.itmayiedu.com/ pay?userId=10&money= 500&userName= < script>window.location.href= "http:/ /www.itmayiedu.com';< /script>
    明白钓鱼网站实现思路。

    XSS攻击原理
    XSS其实就是使用js脚本语言攻击,浏览器默认支持脚本语言执行,如果在提交脚本参数的时候,可能浏览器直接执行。
    XSS攻击最大漏洞常见:论坛、评论XSS

    防御XSS攻击
    1、有些浏览器已经防御了XSS攻击,例如谷歌浏览器
    2、程序中写一个过滤器,拦截所有的参数,将特殊字符转换。例如: >转成>,使用第三方html框架工具进行html字符转换。

    SQL注入

    SQL注入原理:如果程序代码中,dao层的sql语句如果使用拼接方式,那么可能会有SQL注入的问题,拼接语句,成立让SQL进行成立进行。

    在写程序中,dao层的SQL语句不写拼接方式,最好使用预编译方式使用#

    1、#$符号区别
    mybatis的时候,sql语句传递参数最好使用#号,因为#会预编译SQL语句,可以有效的防止SQL语句攻击,$需要SQL语句拼接,可能会受到SQL语句攻击。

    防盗链

    此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。

    相当于限制资源,只能在某个域名(限制某个服务器)来源上进行访问。

    判断http请求头Referer域中的记录来源的值,如果和当前访问的域名不一致的情况下,说明该图片,可能被其他服务器盗用。

    互联网本质通讯底层socket技术,socket技术里面是二进制文件传输。

    实现原理: 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件。 换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址。有了referer跟踪来源就好办了,这时就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面。

    使用过滤器实现防盗链
    nginx实现防盗链

    避免盗链(绕开referer方式)
    采用身份认证、定期修改资源路径等方式

    1. NGINX
      nginx针对文件类型的防盗链配置方法:
    location ~* \.(gif|jpg|png|swf|flv|bmp)$ {
      valid_referers none blocked *.php100.com php100.com;
      if ($invalid_referer) {
          #rewrite ^/ http://www.php100.com/403.html;
          return 403;
      }
    }
    //这种方法是在server或者location段中加入:valid_referers none blocked,其中none表示空的来路,也就是直接访问,比如直接在浏览器打开一个文件,blocked表示被防火墙标记过的来路,*.php100.com表示所有子域名。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    nginx针对文件目录的防盗链配置方法:

    location /img/ {
        root /data/img/;
        valid_referers none blocked *.php100.com php100.com;
        if ($invalid_referer) {
            rewrite ^/ http://www.php100.com/error.gif;
            #return 403;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. SESSIONL:强制用户使用资源时必须登录,通过用户SESSION来控制网站资源的使用。
    2. CDN
      原理
      基于时间戳防盗链的功能其实每家的CDN都是支持的。主要是通过使用约定的加密字符串来对具有访问有效期的资源链接进行一些加密计算的到一个sign值,然后访问外链里面带上这个sign和截止时间戳去访问CDN的节点,CDN的节点会用同样的算法来计算访问链接是否合法,如果不合法则返回403 Forbidden,否则返回所要访问的资源。
      算法说明
      基于时间戳的防盗链是通过对时间有关的字符串进行签名,将时间,签名通过一定的方式传递给CDN服务器作为判定依据,CDN边缘节点依据约定的算法判断来访的URL是否有访问权限。
      如果通过,执行下一步;如果不通过,响应 HTTP 状态码 403。如果同时配置了Referer方式防盗链,UserAgent防盗链,时间戳防盗链,那么如果有其中一项没有通过,那么即响应403。

    CSRF (模拟请求)

    1、互联网API接口幂等设计(包含防止模拟请求)
    什么是幂等:保证数据唯一性,不允许有重复防止表单重复提交

    互联网API幂等设计有哪些解决方案?
    1、MVCC方案
    多版本并发控制,该策略主要使用update with condition (更新带条件来防止)来保证多次外部请求调用对系统的影响是一致的。在系统设计的过程中,合理的使用乐观锁,通过version或者updateTime ( timestamp)等其他条件,来做乐观锁的判断条件,这样保证更新操作即使在并发的情况下,也不会有太大的问题。例如。
    select * from tablename where condition=#condition# //取出要更新的对象,带有版本versoin

    update tableName set name=#name#,version=version+1 where version=#version#
    在更新的过程中利用version 来防止,其他操作对对象的并发更新,导致更新丢失。为了避免失败,通常需要一定的重试机制。

    2、去重表
    在插入数据的时候,插入去重表,利用数据库的唯一索引特性,保证唯一的逻辑。

    3、悲观锁
    select for update,整个执行过程中锁定该订单对应的记录。注意:这种在DB读大于写的情况下尽量少用。

    Token机制,防止页面重复提交

    业务要求: 页面的数据只能被点击提交一次。
    发生原因: 由于重复点击或者网络重发,或者nginx 重发等情况会导致数据被重复提交

    解决办法:
    集群环境:采用token 加redis (redis 单线程的,处理需要排队)
    单JVM环境:采用token加redis或token加jvm内存。

    处理流程:
    数据提交前要向服务的申请token, token 放到redis 或jvm内存,token 有效时间。提交后后台校验token, 同时删除token, 生成新的token返回。

    怎么防止网络延迟重复提交?
    使用Token防止重复提交
    使用场景:在调用API的时候,需要传递令牌,该API获取到令牌之后,执行当前逻辑代码,然后把当前的令牌删除。
    代码逻辑步骤:

    1. 请求接口获取令牌
    2. 判断令牌是否在缓存中有对应的数据
    3. 如果缓存中没有该令牌的话,直接报错(请勿重复提交)
    4. 如果缓存中有该令牌的话,直接执行该业务逻辑。
    5. 执行完业务逻辑之后,直接删除该令牌。

    怎么防止模拟请求?
    如何防止机器模拟请求(使用程序语言发送请求)
    解决:
    1、使用图形验证码防止机器模拟请求(不能百分之百的完全识别)
    2、nginx实现限流
    3、配置黑名单和白名单

    如何防止伪造token请求?
    如何防止黑客使用抓包分析到令牌,黑客技术使用令牌伪造请求支付、下单等核心业务。
    绑定ip不适合。
    在互联网上没有绝对防止不能抓包分析到令牌
    但是可以使用在调用接口时候,确认是本人在操作。
    使用发送短信验证码方式或者图像识别方式。 I
    在核心接口上,一定要确认是本人在操作,比如修改密码、支付下单、转账等核心业务。

    URL特殊字符处理

    什么是特殊字符处理?为什么需要?
    rpc远程通讯实现加密(例如: + ?这些符号)正好和http特殊字符相同,导致转成空格。

    什么是URL转码?
    不管是以何种方式传递url时,如果要传递的url中包含特殊字符,例如想要传递一个+,但是这个+会被url会被编码成空格,想要传递&,被urI处理成分隔符。
    尤其是当传递的urI是经过Base64加密或者RSA加密后的,存在特殊字符时,这里的特殊字符一旦被url处理,就不是原先你加密的结果了。

    转码工具类: Java jdk有提供、lang工具包中含有

    接口加密传输

    对称加密(DES、AES)

    加密和解密都是使用同一个秘钥。

    优点:对称加密速度快
    缺点:同一个秘钥,不安全

    使用场景:加密速度快,服务器和服务器端之间进行通讯(后台和后台通讯),构建网站与机构网站进行合作的情况可以使用对称加密(同一个网段里面 抓包分析抓不到包)

    常见的对称式加密技术

    • DES(数据加密标准):分组式加密,算法源于Lucifer,作为NIST对称式加密标准;64位(有效位56位、校验8位),分组算法
    • 3DES:128位,分组算法
    • IDEA(国际数据加密算法):128位,比DES快,分组算法
    • Blowfish:32-448位,算法公开,分组算法
    • RC4:流密码,密钥长度可变
    • RC5:分组密码,密钥长度可变,最大2048位
    • Rijndael:128位/196位/256位
    • AES(高级加密标准):DES升级版,算法出自Rinjindael

    移动APP安全接口设计

    不能采用对称加密,反编译apk可以获取秘钥。然后通过抓包分析数据。
    使用HTTPS传输、使用令牌、使用非对称加密(RSA)。

    非对称加密

    私钥和公钥(公钥加密, 私钥解密)目前最安全的加密手段,缺点:效率低
    在这里插入图片描述

    应用场景:第三方支付对接、核心金融机构。

    实现步骤:
    1、生成公钥和私钥对(使用工具或者代码生成)
    2、使用公钥加密
    3、使用私钥解密

    常用算法:
    RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)

    如何防止抓包篡改数据
    基于令牌的方式实现参数安全传输:

    A (主站) B(支付)

    1. 在跳转支付系统之前生成参数令牌
    2. A调用B支付系统生成令牌参数,返回参数令牌。
    3. A跳转到B使用令牌方式跳转
    4. 支付系统接收令牌参数获取对应的userId和全额参数
    5. 访问时候,携带moeny userId ,服务器获取到然后生成token,并存入到redis(实际是存在数据库中) 中 key为token value为money userId
    6. 调用支付时候 携带 token,服务器端通过token去查询出money userid 进行操作

    参考博客:https://www.cnblogs.com/toov5/p/10321364.html

  • 相关阅读:
    玩转TypeScript之你真的了解this所指对象吗
    新手小白前端学习艰辛之路
    常用注解@JsonField、@JsonFormat、@DateTimeFormat区别
    App Store 已上架项目打开瞬闪问题
    SpringBoot初体验
    Unity(三) Shader着色器初探
    SpringBoot集成EasyExcel快速人们
    ManageEngine 第六次入选 Gartner® 安全信息和事件管理魔力象限™!
    帧同步相关总结
    tracemalloc分析内存使用情况与泄露
  • 原文地址:https://blog.csdn.net/weixin_44044929/article/details/126354118