几种常见Web安全攻击方式 CSRF 、XSS 、SQL注入

ps: 如果有任何问题可以评论留言,我看到后会及时解答,评论或关注,您的鼓励是我分享的最大动力

      转载请注明出处:https://blog.csdn.net/qq_40938301/article/details/87868755

CSRF攻击

概念:

CSRF(Cross Site Request Forgery),跨站请求伪造。

CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。

eg:用户A 用浏览器 访问了csdn网站,登录后,会把登录信息保存在用户A的浏览器cookie中。这时用户A访问了攻击人的网站 B,但是B网站一加载到用户A的浏览器中,就执行一段js文件,这个js文件是向csdn网站请求改用户密码,那么csdn网站接到这个请求时,会验证,由于之前用户A的浏览器cookie中保存了登录信息,csdn网站会认为这是用户的操作,就直接执行。这就是所谓的请求伪造。

解决方案:

1、Token (最安全)

现在业界对CSRF的防御,一致的做法是使用一个Token(Anti CSRF Token)。

例子:

1. 用户访问某个表单页面。

2. 服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中。

3. 在页面表单附带上Token参数。

4. 用户提交请求后, 服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,一致为合法请求,不是则非法请求。

这个Token的值必须是随机的,不可预测的。由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。

2、HTTP Referer

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。

referer Check在Web最常见的应用就是“防止图片盗链”。同理,Referer Check也可以被用于检查请求是否来自合法的“源”(Referer值是否是指定页面,或者网站的域),如果都不是,那么就极可能是CSRF攻击。

但是因为服务器并不是什么时候都能取到Referer,所以也无法作为CSRF防御的主要手段。但是用Referer Check来监控CSRF攻击的发生,倒是一种可行的方法。

3、加验证码

验证码,强制用户必须与应用进行交互,才能完成最终请求。在通常情况下,验证码能很好遏制CSRF攻击。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段,不能作为主要解决方案。

XSS攻击

概念:

XSS(Cross Site Scripting), 跨站脚本

(X 在英语中也可以指 Corss ,为了避免与样式CSS混淆,所以用 X 代替 C )

XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。

从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

解决方案:

不可以信任客户端提交的数据!!!

1、对用户输入数据进行处理

(1)编码:不能对用户输入的内容都保持原样,对用户输入的数据进行字符实体编码。

(2)解码:原样显示内容的时候必须解码,不然显示不到内容。

(3)过滤:把输入的一些不合法的东西都过滤掉,从而保证安全性。

2、对cookie的保护

对重要的cookie设置httpOnly, 防止客户端通过document.cookie读取cookie。服务端可以设置此字段。

SQL注入

概念:

SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。 攻击者通过在应用程序预先定义好的SQL语句结尾加上额外的SQL语句元素,欺骗数据库服务器执行非授权的查询,篡改命令。

eg:

假设的登录查询

SELECT * FROM  users  WHERE login = 'victor' AND password = '123

Sever端代码

String sql = "SELECT * FROM users WHERE login = '" + formusr + "' AND password = '" + 

formpwd + "'";

输入字符

formusr = ' or 1=1

formpwd = anything

实际的查询代码

SELECT * FROM users WHERE username = ' ' or 1=1  AND password = 'anything'  

解决方案:

后端采用参数化查询,参数化查询是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值。

发布了57 篇原创文章 · 获赞 12 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_40938301/article/details/87868755