详解常见web攻击手段(2)

CSRF 攻击的关键就在于利用了用户未过期的 Cookie,那么为了防止 Cookie 的盗取,就需要在 Cookie 中设置 HttpOnly 属性,这样通过程序(XSS 攻击)就无法读取到 Cookie 信息,避免了攻击者伪造 Cookie 的情况出现。

2)增加 token

该防护手段还是针对 Cookie 的盗取,由于请求中所有的用户验证信息都存放于 Cookie 中,因为我们抵御 CSRF 的关键就在于:如何在请求中放入攻击者所不能伪造的信息,并且该信息不能存放在 Cookie 中。那么我们就可以在请求返回中加入一个随机生成的 token,当请求来到时进行 token 的校验,如果校验不通过则认为是 CSRF 攻击而拒绝该请求。

3)通过 Referer

根据 HTTP 协议,在 HTTP 请求头上有一个字段叫做 referer,它记录了该Http 请求的来源地址。在通常情况下,访问一个安全受限的页面的请求都来自同一个网站。

在 CSRF 中恶意请求是从 恶意站点 发出的,因此要防御 CSRF 攻击,需要对每一个请求验证其 referer 值即可。

详解常见web攻击手段

三、SQL 注入攻击

SQL注入 是程序员最经常遇到的,所谓 SQL注入,就是通过把 SQL 命令伪装成正常的请求参数,传递到服务端,欺骗服务器最终执行恶意的 SQL命令,达到入侵的目的。攻击者常常利用 SQL 注入的漏洞,来查询非授权的关键信息,修改数据库服务器的数据,改变表结构,危害极大!

1、攻击原理

我们查询用户存不存在往往是通过以下 SQL:

SELECT * FROM s_user WHERE username = '' and password = ''

当我们后端使用以下代码查询时,便会出现致命的漏洞

Connection con = getConnection(); Statement st = (Statement) con.createStatement(); String sql = "SELECT * FROM s_user WHERE username = '"+ username +"' and password = '"+ passward+"' "; ResultSet rs = st.executeQuery(sql); while(rs.next()){ ... }

上面代码逻辑便是利用前端传入的参数进行数据库查询,乍看之下感觉毫无问题,但是这个时候如果 password 前端传过来的值是 ' or '1'='1

那这个时候 SQL 就会变成

SELECT * FROM s_user WHERE username = '' and password = '' or '1'='1'

这样的 SQL 不用试都知道会把数据库中的用户全都查出来,明明没有输入正确的密码,却返回了登录成功。而这便是一次简单且典型的 SQL 注入攻击。

' or '1'='1 危害是让用户免密码登录,如果传过来的值为 '; drop table xxx; -- 这个时候问题就大了!

2、防护手段

1)使用预编译语句

预编译语句 PreparedStatement 是 java.sql 中的一个接口,继承自 Statement 接口。

预编译语句和 Statement 的不同之处在于,创建 PreparedStatement 对象时就指定了 SQL 语句,该语句立即发送给 DBMS 进行编译,当该编译语句需要被执行时,DBMS 直接运行编译后的 SQL 语句,而不需要像其他 SQL 语句那样先将其编译:

String sql = "SELECT * FROM s_user WHERE username = ? and password = ? "; PreparedStatement st = conn.preparedStatement(sql); st.setString(1, username); st.setString(2, password); ResultSet rs = st.executeQUery();

可以看到,SQL 语句中原有的白能量已经用占位符 ? 替代了,变量通过 setString() 方法进行设置。

2)使用 ORM 框架

防止 SQL 注入的关键手段在于对一些关键字进行转义,而常见的一些 ORM 框架,如 Mybatis,Hibernate等,都支持对响应的关键字或者特殊符号进行转义,可以通过简单的配置,很好的预防 SQL 注入的漏洞,降低普通开发人员进行安全编程的门槛。

四、文件上传漏洞

很多网站都有上传的功能,如上传图片、文件、压缩包等等。而这些资源往往是保存在远端服务器上。文件上传攻击指的就是攻击者利用一些站点没有对文件类型做很好的校验,上传了可执行的文件或脚本,并且通过脚本对服务器进行一定的权限操作,或是通过诱导外部用户访问该脚本文件,达到攻击的目的。

当然,这种攻击防护上也是比较简单,为了防止用户上传恶意的可执行脚本文件,以及将文件上传服务器当做免费的文件存储服务器来使用,我们需要对上传文件的类型进行白名单校验,并且需要限制上传文件的大小,上传的文件需要进行重新命名,使攻击这无法猜测到上传文件的访问路径。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysfsj.html