带你理解什么是sql注入攻击、xss攻击和cors攻击

这篇文章主要介绍了带你理解什么是sql注入攻击、xss攻击和cors攻击,网络安全问题一直是互联网开发的重灾区,今天我们来认识一下这几种攻击方式,需要的朋友可以参考下

SQL注入

SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

SQL注入攻击的总体思路:

  • 寻找到SQL注入的位置
  • 判断服务器类型和后台数据库类型
  • 针对不同的服务器和数据库特点进行SQL注入攻击

SQL注入攻击实例:

比如,在一个登录界面,要求输入用户名和密码,可以这样输入实现免帐号登录:

用户名: ‘or 1 = 1 -- 密 码: 

用户一旦点击登录,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了。这是为什么呢?

下面我们分析一下:从理论上说,后台认证程序中会有如下的SQL语句:

String sql = “select * from user_table where username=' “+userName+” ' and password=' “+password+” ‘”; 

因此,当输入了上面的用户名和密码,上面的SQL语句变成:

SELECT * FROM user_table WHERE username=''or 1 = 1 –- and password='' 

分析上述SQL语句我们知道,username=‘ or 1=1 这个语句一定会成功;然后后面加两个 -,这意味着注释,它将后面的语句注释,让他们不起作用。这样,上述语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

如何应对:

  • 参数绑定
    使用预编译手段,绑定参数是最好的防SQL注入的方法。目前许多的ORM框架及JDBC等都实现了SQL预编译和参数绑定功能,攻击者的恶意SQL会被当做SQL的参数而不是SQL命令被执行。在mybatis的mapper文件中,对于传递的参数我们一般是使用 # 和$来获取参数值。 当使用#时,变量是占位符 ,就是一般我们使用javajdbc的PrepareStatement时的占位符,所有可以防止sql注入;当使用 $ 时,变量就是直接追加在sql中,一般会有sql注入问题。
  • 使用正则表达式过滤传入的参数

XSS攻击

它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。

XSS的攻击方式就是想办法“教唆”用户的浏览器去执行一些这个网页中原本不存在的前端代码。

我们常用的留言板就可以产生XSS攻击(持久性),我们知道留言板通常的任务就是把用户留言的内容展示出来。

正常情况下,用户的留言都是正常的语言文字,留言板显示的内容也就没毛病。

然而这个时候如果有人不按套路出牌,在留言内容中丢进去一行:

那么留言板界面的网页代码就会变成形如以下:

那么这个时候问题就来了,当浏览器解析到用户输入的代码那一行时会发生什么呢?

答案很显然,浏览器并不知道这些代码改变了原本程序的意图,会照做弹出一个信息框。就像这样:

  留言板 

非持久 XSS攻击:

攻击者注入的数据反映在响应中,一个典型的非持久性XSS攻击包含一个带XSS攻击向量的链接(每次攻击需要用户点击)

比如: 正常发送消息:

//www.test.com/message.php?send=Hello,World!

非正常发送消息: 接收者接收消息显示的时候将会弹出警告窗口

http://www.test.com/message.php?send=! 

XSS攻击的主要原因就是过于信任客户端提交的数据。

解决方法是不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步的操作。

解决的具体方案:

  • 将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了(如果在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击);
  • 表单数据规定值的类型,例如:年龄应为只能为int、name只能为字母数字组合
  • 对数据进行Html Encode 处理(对HTML转义)
  • 过滤或移除特殊的Html标签,例如: