文章目录
web开发安全问题
越权
越权是指操作主体能够访问逾越期权限的资源。比如A操作了B的订单,非管理者查看了管理者才能访问的数据。
越权可以分为水平越权和垂直越权。
水平越权
水平越权又被称之为数据越权,如上述所说的A操作了B的订单数据。
案例
如下所示,攻击者可以取消任意一个订单
cancelOrderByOrderId(String orderId){
updateStatusByOrderId(orderId);
}
防御
在访问前先进行身份验证,A所操作的数据是否是A的数据。如下所示
cancelOrderByOrderId(String orderId) {
Long userId = getUserIdByCookie();
Order order = queryOrderByOrderId(orderId);
if (order != null && order.getUserId().equeals(userId)) {
updateStatusByOrderId(orderId);
} else {
//return null 或者抛出异常
}
垂直越权
垂直越权又被称之为功能越权,例如员工访问了老板才能访问的功能。
解决方法:在代码逻辑中检查用户的角色,确保该角色拥有此项权限。
XSS
跨站脚本攻击,Cross Site Script。是指攻击者在网页上注入恶意代码,并且让浏览器执行而达到攻击目的的手段。
它危害极大,可以获取用户Cookie,篡改页面,钓鱼攻击等等。
XSS可以分为三类
持久型攻击(持久型攻击)
杀伤力最大的一种,它将恶意代码存储到服务器,只要有用户访问了这个数据,就会执行恶意代码,进而攻击。
例如,将恶意代码上传到论坛的发言中,每一个访问者都会中招。
案例
在一个论坛上输入 </div><script>alert(1)</script>
,它将存储到服务端,如果前后端没有防范XSS的话,每一个访问你帖子的人都会弹出一个弹窗。
反射型攻击
反射性攻击是指攻击者实时注入恶意代码,但不会存储到服务端。
案例
一个搜索页面会提供一个搜素框,且会将用户的输入最终输出到页面。因此可以在搜索框中输入一段js代码进行攻击。
DOM型攻击
算是一种反射型跨站脚本攻的特例,利用动态修改DOM文档的能力实时注入恶意代码进行攻击。
防御
对用户的输入进行过滤转码,将特殊字符转义
- 将要插入html代码块中的进行html转义
- 将要插入js代码块中的进行js转义
- 将要插入到css中的进行css转义
- jsonp返回格式的数据,要保证响应的Content-Type为 application/json,避免text/html
设置HttpOnly
CSP(Content-Security-Policy),内容安全策略,是浏览器与跨站脚本攻击抗争的产物,其提供一个额外的安全层。
CSRF
CSRF 跨站点请求伪造(Cross—Site Request Forgery) 是指攻击者在控制的页面伪造请求,向服务端发送请求而到达攻击目的的手段。
案例
某购物网站A取消订单的请求https://www.xxx.com/shop/cancelorder?activityid=y
。
- 被攻击者先登录了网站A,网站A在xxx这个域种下了Cookie。
- 被攻击者不小心访问了攻击者控制的网站B,且在B网站中会执行
https://www.xxx.com/shop/cancelorder?activityid=y
,因此在访问B网站时,攻击者伪造了请求,并向网站A的服务器发起了访问(带上了Cookie),取消了订单。
防御
- 验证请求Header中的Referer字段,如果Referer不是合法的,那么可以拒绝请求。该方法简单高效,但是黑客可以攻击浏览器修改Referer字段,用户也可能认为Referer会泄露隐私,会拒绝提供Referer。
- 在发起请求时,带上动态生成的token。这个token可以在用户访问网站时生成,发起请求时再带上,这个token不能存储到Cookie中。
SQL注入
攻击者将非法的SQL注入到参数中,使得数据库执行非预期的SQL语句,造成攻击。本质上是程序与代码没有做到分离。
案例
一个网站提供了按照活动名称搜索活动记录的功能,后台的SQL语句:'SELECT * FROM activity WHERE name = ' + 'keyword'
;攻击者输入a or 1=1
就能拿到所有的数据。
防御
- Java语言可以使用预编译功能,将参数与SQL语句分离
- Mybatis使用
${param}
,不要使用#{param}
- 检查输入是否包含非法词
文件操作
- 任意文件上传:上传js代码造成XSS攻击,上传超大文件,上传木马
- 文件覆盖:用户上传时指定了上传的路径,覆盖服务器上的文件
- 文件下载:用户下载时指定了路径,下载服务器上的其他文件
案例
上传文件时,后端构造的路径/xxx/yyy/+param
上传文件时用户构造参数../../etc/profile
,就有可能覆盖/etc/profile
文件,下载攻击类似
防御
- 上传文件:限制文件格式、限制文件大小、限制”…/“等字符、对文件名重命名
- 下载文件:限制”…/“等字符
命令注入
类似SQL注入
CROS配置不当
cros是用来解决跨域问题的,但是在开发时,后端为了方便,会如下设置
response.setHeader("Access-Control-Allow-Origin", "*");
这会使得所有域的请求都会接受,因此可能会造成CRSF攻击。正确的做法是严格控制,使用白名单进行验证。