java - 存储的 xss 安全威胁
问题描述
我们正在努力进行安全预防,并在下面的代码中buffer
提供存储的 XSS 攻击......下面是我们从Checkmark工具获得的信息。
方法
test
从数据库中获取数据,用于buffer element
. 然后,该元素的值在没有经过适当过滤或编码的情况下流经代码,最终在 method 中显示给用户test
。这可能会启用存储的跨站点脚本攻击。
private void test(HttpServletResponse response, SessionInfo sessionInfo, String applicationName, String resourceName, String resourcePath, String domainAddress, String siteAddress, String fileNames) throws KatalystServletException, IOException, FSException
{
InputStream in = resourceFile.getInputStream();
ZipOutputStream zipOut = null;
try {
byte[] buffer = new byte[8 * 1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
zipOut.write(buffer, 0, bytesRead);
}
} finally {
in.close();
zipOut.flush();
}
}
解决方案
这是该问题的解决方案,也是Checkmarx 在 Java 中标记的HRA_JAVA_CGI_STORED_XSS或存储的 XSS漏洞的解决方案。
对于使用 byte[] 数组作为缓冲区的任何 Java 文件操作,Checkmarx 都会标记此问题。
在写入任何输出流之前,您需要消毒您的手(悲伤的脸)以及您的字节数组。您可以使用 ESAPI 的验证器功能来解决此问题。
将 ESAPI jar 添加到您的项目中
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>2.2.2.0</version>
</dependency>
import org.owasp.esapi.*;
在写入 OutputStream 之前,在您的情况下是 ZipOutputStream 我们需要使用 getValidFileContent(String context,byte[] input, int maxBytes, boolean allowNull) 过滤字节数组缓冲区
此方法检查任何文件结尾漏洞、文件损坏攻击或其他入侵攻击(我找不到关于它们的太多信息,如果我找到更多信息会更新。)
private void test(HttpServletResponse response, SessionInfo sessionInfo, String applicationName, String resourceName, String resourcePath, String domainAddress, String siteAddress, String fileNames) throws KatalystServletException, IOException, FSException
{
InputStream in = resourceFile.getInputStream();
ZipOutputStream zipOut = null;
try {
byte[] buffer = new byte[8 * 1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
// HERE IS THE MAGIC LINE
buffer=ESAPI.validator().getValidFileContent("blah blah",buffer,8192,true);
//TADA
zipOut.write(buffer, 0, bytesRead);
}
} finally {
in.close();
zipOut.flush();
}
}
我在使用 Util 方法时遇到了类似的问题,它在 8 个地方被标记。在此修复后,所有问题均已解决。
我还建议使用 try catch finally 块并关闭“finally”部分中的 InputStreams 和 OutputStreams,或者您可以使用“Try with Resources”。
未关闭这些流在另一个 CodeScan 中被标记为“资源匮乏” - 未释放的资源可能导致系统速度变慢并导致其他内存组件饥饿。
推荐阅读
- python - Python Pyodbc 无法通过 executemany 返回第一个插入的 id
- c# - 如何解决错误:无法加载文件或程序集“Microsoft.VisualStudio.Threading”?
- warnings - 当 FutureBuilder 快照数据等于 0(零)时如何显示自定义警告?
- ruby-on-rails - Rails:如何存储自定义顺序/关联等级(postgres)
- c# - System.IO.Compression 中的 System.MissingMethodException
- azure - 将字符串与 DateTimeOffset 用于日期值时的 Azure 搜索性能
- leaflet - 在传单 js 的搜索框中选择地址后获取地址详细信息
- python - 是否有匹配列表、字典和集合但不匹配字符串的 Python 类型签名?
- javascript - dataTables copy to clipboard interference
- amazon-web-services - AWS Glue 挂起并在 ETL 作业中花费大量时间