常见web安全及防护原理

背景:

作为新手刚入门解决web安全问题时,可以参考大量的理论知识,但具体的攻击细节以及解决方法却很模糊。特此根据工作经验,详细罗列了下。以防自己忘记,也方便快速教会别人~
本文将介绍以下几种常见的攻击手段

  • SQL注入攻击
  • XSS攻击

sql注入

攻击者在用户输入中添加了额外的sql语句,对数据库进行了非法操作

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

如果后台的sql语句使用了动态拼接sql或者非参数化sql,就容易发生sql注入

动态拼接举例:

在这里插入代码片

非参数化sql举例:(例如用的${name}而不是#{name})

在这里插入代码片

那么web是如何攻击的呢?

例如界面上有个删除操作,前台将taskId传给了后台,攻击者故意写成777 | where 1=1
后台收到参数不加任何校验,执行了sql

delete from tb_task where id = ${id}

实际上会执行这个sql

delete from tb_task where id = 777 | 1=1;

显然,就会将整个tb_task表中的数据删掉了,从而达到了攻击的目的,毁坏了系统,让系统无法正常工作。数据都丢了,客户不投诉你才怪~

那么如何解决这类问题呢?

1.从前端入手,对用户输入进行校验,例如不要输入|&等特殊字符。但用户有时候就是想输入这些特殊字符呢?
2.从后端入手,后端构建一个防御体系框,对输入进行校验。
3.还是从后端入手,使用参数化SQL命令

sql注入原理
就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
总的来说有以下几点:
1)永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引
号和双"-"进行转换等。
2)永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
3)永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4)不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息

XSS攻击

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。

将指令代码注入到网页上,网页上加载了这个恶意指令,就容易发生XSS攻击

恶意指令举例

alert('I am a bad link, go to ***');

那么web是如何攻击的呢?

正常情况下,后台返回什么数据,前台就展示什么数据。但后台数据可能包含了恶意指令,例如恶意html或js代码,前台却执行了。
恶意指令可以打开一个弹窗或新页面,弹窗或者页面上有一个恶意链接,诱导了用户打开。用户在恶意页面上(用户以为是合法页面)填写了自己的机密信息,这些信息就被恶意者盗走了。数据被盗走了,客户不投诉你才怪~

那么如何解决这类问题呢?

1.前端不要什么数据都展示好嘛?你和后台可是互不相信滴。对后台返回的数据都要进行转义或者特殊处理,再呈现给用户。React框架JSX语法对此就很友好的处理了,此外一些组件库框架也会友好处理。
2.如果你的框架很原始,那就只能自己动手转换了。对要展示在页面上的数据进行encode等操作。
3.后台数据大部分也是用户输入存入后台库的,所以也可以在界面输入上加校验。一般校验用户输入的长度和非法字符。如果业务上对某个参数有自己的规则,则要按照客户的要求来校验。

常见非法字符:

<>&|;,*

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容

Xss(cross-site scripting)攻击指的是攻击者往Web页面里插入恶意 html标签或者javascript代码。比如:攻击者在论坛中放一个看似安全的链接,骗取用户点击后,窃取cookie中的用户私密信息;或者攻击者在论坛中加一个恶意表单,当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户原本以为的信任站点。
XSS防范方法
首先代码里对用户输入的地方和变量都需要仔细检查长度和对”<”,”>”,”;”,”’”等字符做过滤;其次任何内容写到页面之前都必须加以encode,避免不小心把html tag 弄出来。这一个层面做好,至少可以堵住超过一半的XSS 攻击。
首先,避免直接在cookie 中泄露用户隐私,例如email、密码等等。
其次,通过使cookie 和系统ip 绑定来降低cookie 泄露后的危险。这样攻击者得到的cookie 没有实际价值,不可能拿来重放。
如果网站不需要在浏览器端对cookie 进行操作,可以在Set-Cookie 末尾加HttpOnly 来防止javascript代码直接获取cookie 。
尽量采用POST 而非GET 提交表单

XSS和CSRF的区别(没看懂)

XSS是获取信息,不需要提前知道其他用户页面的代码和数据包。CSRF是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。
要完成一次CSRF攻击,受害者必须依次完成两个步骤:

  • 登录受信任网站A,并在本地生成Cookie。
  • 在不登出A的情况下,访问危险网站B。
    CSRF的防御:
  • 服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。
  • 通过验证码的方法

保护Cookie

对cookie的保护一般放在tomcat安全加固中。可以参考tomcat安全方面的资料

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值