详细描述——缺少 XML 验证
程序未对不可信赖资源的 XML 文档进行恰当模式校验(如 DTD 或 XML schema ),直接进行解析,可
能会导致攻击者进行 XML 攻击。
例如:下面代码片段用于加载一个 XML 文件。但没有启用 DTD 或 XML schema 校验功能,给攻击者进
行恶意输入提供了机会。
try{
...
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
factory.setValidating(false);
...
c_dom=factory.newDocumentBuilder().parse(xmlFile);
}catch(Exception ex){
...
}
解决方案——缺少 XML 验证
程序解析来自不可信赖资源的 XML 时,应该经过恰当模式(如 DTD 或 XML schema )的校验。
详细描述——资源注入
使用用户输入控制资源标识符,借此攻击者可以访问或修改其他受保护的系统资源。当满足以下两
个条件时,就会发生资源注入:
( 1 )攻击者可以指定已使用的标识符来访问系统资源。例如,攻击者可能可以指定用来连接到网络资
源的端口号。
( 2 )攻击者可以通过指定特定资源来获取某种权限,而这种权限在一般情况下是不可能获得的。例如,
程序可能会允许攻击者把敏感信息传输到第三方服务器。
例如:下面的代码片段使用读取自 HTTP 请求的端口号来建立一个套接字。
String remotePort = request.getParameter("remotePort");
...
ServerSocket srvr = new ServerSocket(remotePort);
Socket skt = srvr.accept();
...
这种使用用户输入影响的资源可能存在风险。
解决方案—— 资源注入
为了避免资源注入漏洞攻击,可以采用黑名单或白名单策略。黑名单会有选择地拒绝或避免潜在的
危险字符。但是,任何这样一份黑名单都不可能是完整的,而且将随着时间的推移而过时。比较好的方法
是创建白名单,允许其中的字符出现在资源名称中,且只接受完全由这些被认可的字符所组成的输入。