(1)合规方案
水平越权漏洞的特征就是服务器端没有对提交数据的用户身份做校验,危害程度取决于提交数据是否有规律,因此,我们可通过两个方面来减小水平越权漏洞的危害:
A. 设计数据标识格式
在设计数据库时,通常情况下,我们会将数据表主键设置为自增格式,这样在提交查询时,提交的数据就是有规律的,攻击者可通过遍历的方式来扩大危害程度,建议将自增格式设计为不可猜测格式。
B. 身份鉴别
判断提交的数据是否属于当前登录用户。
(2)安全编码示例:
设计数据标识格式:将数据标识的格式设定为UUID(通用唯一识别码)的格式,生成的UUID是由一个十六位的数字和字母的组合,表现形式如550E8400E29B11D4A716446655440000,可防止攻击者猜解数据ID来越权攻击
public String getUUID() {
UUID uuid = UUID.randomUUID();
String str = uuid.toString();
String uuidStr = str.replace("-", "");
return uuidStr;
}
@RequestMapping(value = "/delete/{addrId}")
public Object remove(@PathVariable Long addrId) {
Map<String, Object> respMap = new HashMap<String, Object>();
if (WebUtils.isLogged()) {
this.addressService.removeUserAddress(addrId, WebUtils.getLoggedUserId());
respMap.put(Constants.RESP_STATUS_CODE_KEY, Constants.RESP_STATUS_CODE_SUCCESS);
respMap.put(Constants.MESSAGE, "地址删除成功!");
} else {
respMap.put(Constants.RESP_STATUS_CODE_KEY, Constants.RESP_STATUS_CODE_FAIL);
respMap.put(Constants.ERROR, "用户没用登录,删除地址失败!");
}
return respMap;
}