Web 安全

XSS 攻击

跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

另一类则是来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个有跨站漏洞的网页,然后构造跨站语句,通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。

XSS分为:存储型和反射型

存储型XSS:存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。

反射型XSS:非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

一句话总结:xss 其实就是 javascript 脚本注入攻击。

XSS漏洞是Web应用程序中最常见的漏洞之一。如果您的站点没有预防XSS漏洞的固定方法,那么就存在XSS漏洞。这个利用XSS漏洞的病毒之所以具有重要意义是因为,通常难以看到XSS漏洞的威胁,而该病毒则将其发挥得淋漓尽致。

1)恶意用户,在一些公共区域(例如,建议提交表单或消息公共板的输入表单)输入一些文本,这些文本被其它用户看到,但这些文本不仅仅是他们要输入的文本,同时还包括一些可以在客户端执行的脚本。如:

<script>

this.document = “*********”;

</script>

2)恶意提交这个表单

3)其他用户看到这个包括恶意脚本的页面并执行,获取用户的cookie等敏感信息。

 

举栗子:

例如在提交表单后,展示到另一个页面,可能会受到XSS脚本注入,读取本地cookie远程发送给黑客服务器端。

 

<script>alert(‘sss’)</script>

<script>window.location.href=’http://www.baidu.com’;</script>

对应html源代码: <script>alert(‘sss’)</script>

最好使用火狐浏览器演示效果

XSS 攻击使用 JS 脚本语言,因为浏览器默认支持脚本语言执行,如果在表单提交的时候,提交一些脚本参数,可能浏览器直接进行执行。例如:<script>window.location.href=’http://www.baidu.com’;</script>  如果没有做XSS防御,一旦执行 浏览器就会跳转到 百度的网站。在真正的项目中,这种现象是不允许存在的。

XSS漏洞场景:

论坛评论的时候没有做XSS漏洞防御。

解决方案

对一些特殊字符进行转义处理,<script>window.location.href=’http://www.baidu.com’;</script> 对这段脚本中的 <、> 符号进行转义,转化为 &lt、&gt。这样就可以防御XSS 攻击。

在程序中我们只需要在拦截器,拦截所有的请求对请求参数做转义处理即可,将脚本特殊字符,转换成html源代码进行展示。

汉子编码http://www.mytju.com/classcode/tools/encode_gb2312.asp

步骤:编写过滤器拦截所有getParameter参数,重写httpservletwrapp方法

将参数特殊字符转换成html源代码保存.

public static void main(String[] args) {
String name = "<script>";
System.out.println("转化前:" + name);
//对特殊字符串进行转义处理
System.out.println("转化后:" + StringEscapeUtils.escapeHtml(name));
}

输出结果为:

       转化前:<script>
       转化后:&lt;script&gt;

* xss 原理:
* 1.使用过滤器 拦截所有请求的参数
* 2.重写 getParameter() 方法
* 3.对特殊字符参数进行转义】

Sql 注入

SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的sql操作。

 

造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码

不要使用拼接SQL语句方式、最好使用预编译方式,在mybatis编写sql语句的时候,最好使用?传参数方式,不要使用#传参数,因为#传参数方式,可能会受到sql语句攻击。

 

如果在程序代码中,sql 语句如果使用拼接的方式,那么可能会出现 Sql 注入的问题。在写程序中,sql 语句中我们应该使用预编译方式,使用 # 符号,而不是使用 $ 符号。

 

 

${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。

 

Mybatis 中,sql 语句传递参数的时候,最好使用 #号,因为# 号是预编译的可以有效的防止 Sql 语句注入攻击。$ 号 是使用 Sql 语句拼接,可能会受到 Sql 语句的攻击。 

 举栗子:

@Select(" SELECT * FROM userInfo where userName='${userName}' and password='${password}'")
UserEntity login(UserEntity userEntity);

由上面的访问可知,我访问登录接口没有传密码最后也登陆成功,这显示是不正确的。我们的sql语句应该使用预编译方式,如下。

 

@Select(" SELECT * FROM userInfo where userName=#{userName} and password=#{password}")
UserEntity login(UserEntity userEntity);

 Web 安全

由以上结果可知,使用预编译方式,可以防止 Sql 注入的问题。

Http请求防盗链

比如A网站有一张图片,被B网站直接通过img标签属性引入,直接盗用A网站图片展示。

相当于限制资源(图片、视频、、文件)只能在某个域名(限制某个服务器)来源上进行访问。

 

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

使用 http 协议请求头中的 Referer 记录请求来源与要限制的域名进行比较,如果一致则是限制的域名,如果不一致 说明可能被盗用了。

我在本地 hosts 文件中配置了2个域名做为演示,hosts 文件目录:C:WindowsSystem32driversetc

 

项目中我允许访问地址是:www.test.com:8080。

地址一致:

地址不一致:

 

出现以上的效果说明,防盗链功能已经做好了。

注意测试的时候,最好开启两个不同的浏览器测试,避免图片缓存的原因

 

CSRF攻击

(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用也就是人们所知道的钓鱼网站。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

一句话总结:CSRF 也就是模拟请求

互联网公司里面会话信息可能使用的是Token方式进行保存的。

 

也就是保证数据的唯一性,不允许重复。例如:防止表单重复提交。

怎么样防止重复提交

怎么防止网络延迟情况下的重复提交

多版本并发控制,该策略主要使用 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 来防止,其他操作对对象的并发更新,导致更新丢失。为了避免失败,通常需要一定的重试机制。

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

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

 

 

业务要求:表单只能被提交一次,不能进行重复提交。

 

发生原因:由于重复点击或者网络重发,或者 nginx 重发等情况会导致数据被重复提交。

 

解决办法:

 

集群环境:采用 token 加 redis(redis 单线程的,处理需要排队)

 

单 JVM 环境:采用 token 加 redis 或 token 加 jvm 内存

 

处理流程:

 

数据提交前要向服务的申请 token,token 放到 redis 或 jvm 内存,token 有效时间

 

提交后后台校验 token,同时删除 token,生成新的 token 返回

 

token 特点:要申请,一次有效性,可以限流

客户端每次在调用接口的时候,需要在请求头中,传递令牌参数,每次令牌只能用一次。

一旦使用之后,就会被删除,这样可以有效防止重复提交。

步骤:

1.生成令牌接口

2. 接口中获取令牌验证

如何防止机器模拟请求(使用小程序模拟发送请求,例如:使用httpClient 技术)

使用图形验证码防止机器模拟接口请求攻击或者使用Nginx 实现限流、配置黑名单和白名单。

建议:在调用核心业务接口时,比如支付、下单、等接口,最好使用手机短信验证验证或者是人脸识别,防止其他用户使用Token伪造请求。

在互联网公司中,会话信息使用令牌方式保存的。

如何防止黑客使用抓包工具分析到token,然后黑客使用令牌伪造支付、下单等核心操作。

目前市场上没有绝对能够防止黑客不能抓包分析token的技术。

我们可以使用短信验证码方式或者图像识别(人脸识别)的方式来提高安全性。

 

原文链接:https://www.cnblogs.com/ming-blogs/p/11032234.html

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/18694

(0)
上一篇 2023年11月7日 22:37
下一篇 2023年11月8日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml