10分钟内完成示例的CORS,XSS和CSRF

本文应该是现有Web安全标准,最常见的Web攻击及其预防方法的切入点。 最后,您还将发现Samy是如何以及为什么成为每个人的英雄(我想除了Rupert Murdoch的英雄)。

CORS

跨域资源共享(CORS)是IE10 +,Chrome 4 +,Firefox 3.5+或2012年之后发布的几乎所有版本的浏览器(Opera Mini除外 )的安全功能

当在域website.com上可用的服务器上配置了CORS时,该域中通过AJAX请求的资源必须从该域提供的资产中启动。
CORS

换句话说,如果我们在domain-b.com上启用了CORS并将其配置为仅允许来自domain-b.com GET请求,那么如果您要使用https://domain-b.com/images/example.png下的可用图像https://domain-b.com/images/example.png在您的网站(位于domain-a.com上托管)上的domain-a.com ,对于大多数访问者domain-a.com ,该图片不会被加载。
当任何不遵守CORS policy工具或浏览器提出请求时,您仍然可以使用受CORS保护的资源。

CORS配置

默认情况下 ,CORS被禁用,这意味着没有足够的服务器处理程序来配置CORS,这意味着您无法访问XHR中来自不同来源的资源。 基本上,如果您不执行任何操作或仅针对特定域专门启用CORS,则尝试访问您的资源的任何AJAX请求都将被拒绝,因为Web浏览器遵守CORS policy
这就是为什么在您开始使用VueJS和NodeJS开发SPA时遇到CORS问题的原因。 您的VueJS应用程序托管在http://localhost:8080 ,当您尝试访问http://localhost:8000上的NodeJS服务器应用程序时,会得到“ No Access-Control-Allow-Origin header is present ”,因为这是两个不同的地方ORIGINSPROTOCOLHOSTPORT组合)。

在VueJS开发模式下解决CORS问题的不错方法是在vue.config.js文件中设置devServer代理,如下所示:

module . exports = {
  ...
  devServer : {
    proxy : ' http://localhost:8000 ' ,
  },
  ...
}

要在生产环境中设置CORS,您应该为OPTIONS请求添加适当的侦听器。 该侦听器应该发送no body但带有标Headers响应200 ,标Headers将定义您想要的CORS策略

Access-Control-Allow-Origin: https://domain-b.com
Access-Control-Allow-Methods: GET

有关如何配置CORS的更多信息,请检查https://enable-cors.org/index.html ,并深入研究CORS policy请检查https://livebook.manning.com/book/cors-in-action/part -1 /


XSS

XSS代表跨站点脚本,它是攻击的注入类型。 在OWASP 2017年确定的十大漏洞中,它排名第七。跨站点脚本是攻击者将恶意脚本注入受信任的网站的方法。(部分更新,感谢Sandor)此类攻击有3种类型。

  1. 存储的XSS-漏洞来自未经保护和未清除的用户输入,这些输入直接存储在数据库中并显示给其他用户
  2. 反映的XSS-漏洞来自直接在网页中使用的URL的未保护和未过滤的
  3. 基于DOM的XSS-与反映的XSS相似,来自直接在网页中使用的URL的不受保护和未经过滤的值,不同之处在于基于DOM的XSS甚至没有进入服务器端

攻击

1.存储的XSS

这是攻击的一个例子。 攻击者进入您的网站,找到不受保护的输入字段(例如,注释字段或用户名字段),并输入恶意脚本而不是期望值。 之后,每当该值显示给其他用户时,它将执行恶意代码。 恶意脚本可能会尝试访问其他网站上的帐户,可能参与DDoS攻击或类似行为。 视觉表示(来源geeksforgeeks.org):

XSS示例

2.反映的XSS

反映的XSS是攻击者发现具有此类漏洞的页面时发生的攻击,例如:

预期的网址: https://mywebpage.com/search?q=javascript : https://mywebpage.com/search?q=javascript
恶意网址: https://mywebpage.com/search?q=<script>alert('fortunately, this will not work!')</script>https://mywebpage.com/search?q=<script>alert('fortunately, this will not work!')</script>

<body>
...
<div> showing results for keyword 
<script> document . write ( window . location . href . substr ( window . location . href . indexOf ( ' q= ' ) + 2 ))
</script>
</div>
...
...JavaScript results...
...
</body>

发现后,攻击者诱使用户单击此类恶意URL并瞧瞧。 用户敏感数据被利用。

在geekforgeeks.com提供的示例中说明了攻击的生命周期:

反映的XSS示例

3.基于DOM的XSS

这种攻击与所反映的相同,但不同之处在于恶意URL部分根本不会发送到服务器。 对于以上示例:

预期的网址: https://mywebpage.com/search?q=javascript : https://mywebpage.com/search?q=javascript
恶意网址(反映为XSS): https://mywebpage.com/search?q=<script>alert('fortunately, this will not work!')</script> : https://mywebpage.com/search?q=<script>alert('fortunately, this will not work!')</script> q https://mywebpage.com/search?q=<script>alert('fortunately, this will not work!')</script>警报(“很遗憾https://mywebpage.com/search?q=<script>alert('fortunately, this will not work!')</script>
恶意网址(基于DOM的XSS): https://mywebpage.com/search#q=<script>alert('fortunately, this will not work!')</script> : https://mywebpage.com/search#q=<script>alert('fortunately, this will not work!')</script> alert(“幸运的是https://mywebpage.com/search#q=<script>alert('fortunately, this will not work!')</script>

区别在于使用字符#而不是? 。 浏览器不会在#之后向服务器发送URL的一部分,因此它们会将URL直接传递给您的客户端代码。

保护

用户可以输入并在您的应用中使用的每个值 (在服务器端或客户端)均应视为不可信数据 ,因此应在使用前进行处理 ! 您还应该在服务器应用程序和客户端应用程序中进行安全检查!
文档所示, VueJS本身会在从变量获取值之前对字符串进行转义。 较新版本的Angular也会隐式地对字符串进行转义,因此,如果您使用的是Vanilla JS,JQuery或类似的语言,则应手动实现字符串转义。

下面列出了三种处理不可信数据的最常用方法,理想的方法取决于您需要处理的字段的实际类型。

1.字符串验证

验证是一种方法,用户可以定义规则集,并在继续操作之前要求不受信任的数据来满足这些规则。 此方法适用于数字值用户名电子邮件密码和具有具体语法规则集的类似字段。

在考虑自己编写验证器之前,请先检查框架的现有库。

2.字符串转义

对于应该使用户能够使用标点符号的情况,转义方法很有用。 此方法遍历字符串并查找特殊字符(例如< > ,并用适当的HTML字符实体名称替换它们。 这是您可以使用的基本功能:

function escapeText ( text ) {
  return text . replace ( /&/g , ' &amp; ' )
             . replace ( /</g , ' &lt; ' )
             . replace ( />/g , ' &gt; ' )
             . replace ( /"/g , ' &quot; ' )
}

再次,在编写自己的库之前检查现有库。

3.字符串清理

当允许用户在其评论,文章或类似内容中输入一些HTML标签时,将使用消毒字符串。 sanitize方法遍历文本,查找您指定的HTML标记并将其删除。 使用这种方法的最受欢迎的库之一是Google Closure
这种方法耗费资源并且被认为是有害的,因此在选择它之前需要做更多的研究。

Web浏览器(自哪个版本以来,没有可用的资源,IE在2014年修复了此问题。)在将URL发送到服务器端并使它们在window.location对象中可用之前,它们会自动转义URL,因此这里的第二和第三类型攻击是了解它们,并明确指出URL参数也应视为不可信数据。

有关XSS的更多详细信息,以及如果您轮流使用许多不受信任的数据时如何正确保护应用程序,请查看有关XSS预防的OWASP速查表


CSRF

跨站点请求伪造或CSRF是当恶意网站,电子邮件,博客,即时消息或程序导致用户的Web浏览器经过身份验证的其他受信任站点执行有害操作时发生的一种攻击。 当浏览器随每个请求自动发送授权资源(例如会话cookie,IP地址或类似内容)时,可能会出现此漏洞。

攻击

假设用户已登录到不受保护的证券交易所Web应用程序,并且您正在使用任一会话cookie或JWT cookie进行身份验证。 攻击者还会使用您的服务,并且能够检查您的API的工作方式。 攻击者欺骗用户执行脚本(通过单击电子邮件中的SPAM链接或类似内容),该脚本会将请求发送到您的API https://www.stockexchange.com/users/withdraw?how_much=all&address=MY_ADDRESS (糟糕的API设计,不要这样做)问)。 由于请求是从浏览器执行的,该浏览器随每个请求发送身份验证有效负载,因此您的股票交换Web服务器将成功地对用户进行身份验证并执行交易,并且欺骗的用户将失去所有余额, 而不会意识到,因为所有事情都在后台发生。 视觉表示(来源miro.medium.com)
CSRF攻击

保护

幸运的是,有易于实施的模式可以防止这种Web攻击。 最常见的模式之一是CSRF token 。 基本上程序如下:

  1. 为每个用户的请求生成唯一的令牌,即CSRF token
  2. 将其安全地存储在服务器上,并将其作为响应的有效载荷发送回用户。
  3. CSRF token存储在客户端。
  4. 当用户尝试执行任何状态更改*请求时,发送带有请求作为有效负载的CSRF token
  5. 在服务器端执行该请求之前,请检查CSRF token是否存在并且有效。

这是防止所有用户遭受CSRF攻击的最简单方法。

如果您只与使用现代浏览器的访问者打交道,则可以依赖会话cookie的SameSite属性。(感谢Gergely)

由于服务器的响应在XHR响应中是可处理的, 因此如果您的Web应用程序容易受到XSS的攻击 ,那么CSRF攻击就没有任何保护!

若要深入了解CSRF上的OWASP速查表

奖金

关于蠕虫的作者Samy的简短纪录片,该蠕虫的作者在2005年通过滥用MySpace的CSRF防御功能使MySpace滥用XSS漏洞而被击倒。
https://youtu.be/DtnuaHl378M

有关Samy蠕虫的更多信息
https://samy.pl/myspace/tech.html

From: https://dev.to/maleta/cors-xss-and-csrf-with-examples-in-10-minutes-35k3

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security是一个强大的安全框架,用于在Spring应用程序中实现身份验证、授权和其他安全功能。它也提供了对CORSCSRF的支持。 对于CORS,Spring Security提供了一些配置选项来允许跨域资源共享。你可以通过`cors()`方法来启用CORS支持,并配置允许访问的域、方法和头部。例如,以下配置允许来自任何域的GET和POST请求: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .cors().and() // 其他配置... } @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); configuration.addAllowedOrigin("*"); configuration.addAllowedMethod("GET"); configuration.addAllowedMethod("POST"); configuration.addAllowedHeader("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); return source; } } ``` 对于CSRF防护,Spring Security默认会启用CSRF保护。它会自动生成一个CSRF令牌,并将其包含在表单中或者在请求头中发送。开发者可以通过配置来自定义CSRF令牌的生成和验证方式。以下是一个简单的配置示例: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and() // 其他配置... } } ``` 上述配置将CSRF令牌存储在Cookie中,并且在响应中发送给客户端,客户端将令牌作为请求的一部分发送给服务器进行验证。 综上所述,Spring Security提供了对CORSCSRF的支持,并且可以通过配置来自定义其行为。开发者可以根据具体需求进行相应的配置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值