【发布时间】:2018-12-27 06:13:15
【问题描述】:
我在我的安卓应用程序中使用了地图。我传递了起点和终点纬度,并从地图 url 获取数据,然后解析响应。
但在审核下面标记为 DOS 攻击的代码时,会指出“此代码可能允许攻击者使程序崩溃或以其他方式使其对合法用户不可用。” 关注:如果攻击者推送过大的文件,那么它会逐行运行并且循环运行时间过长。 建议的解决方案:不允许读取超过特定文件大小的文件,这样它就不会读取超出某些限制的文件
这是我的代码:
String url = "https://maps.googleapis.com/maps/api/directions/json"+ "?" + str_origin + "&" + str_dest + "&" + "sensor=false";
private String downloadDataFromUrl(String strUrl) throws IOException {
String data = "";
InputStream iStream = null;
HttpsURLConnection urlConnection = null;
try {
URL url = new URL(strUrl);
urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.connect();
iStream = urlConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(iStream),1024);
StringBuffer sb = new StringBuffer();
String line = "";
while ((line = br.readLine()) != null) {
sb.append(line);
}
data = sb.toString();
br.close();
} catch (Exception e) {
Log.d("Exception", e.toString());
} finally {
iStream.close();
urlConnection.disconnect();
}
return data;
}
请提供解决方案。提前致谢。
编辑 1:通过调用 append(),它将 Untrusted 数据附加到使用默认支持数组大小 (16) 初始化的 StringBuilder 实例。这会导致 JVM 过度消耗堆内存空间。
【问题讨论】:
-
不等待 readLine 方法返回 null 而是检查读取的字节是否有问题?
-
没有。我的审计员说,在不检查文件大小的情况下读取文件是一种不好的做法。如果攻击者推送了 1GB 文件,那么它可能会进入一些永无止境的循环。
-
@comodoro 请检查编辑部分
标签: android bufferedreader readline denial-of-service