如何防止android中的拒绝服务(DOS)攻击?
Posted
技术标签:
【中文标题】如何防止android中的拒绝服务(DOS)攻击?【英文标题】:How to prevent denial of services(DOS) attacks in android? 【发布时间】: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 请检查编辑部分 【参考方案1】:如果你从一个未知的 URL 下载,数据确实可以是任意的,BufferedReader.readLine()
可以遇到一行,只要程序无法处理它。 This question 表示限制BufferedReader
的行长可能不是微不足道的。
行数也可能太大,在这种情况下,行计数检查而不是 while 循环中的简单 null 检查似乎就足够了。
问题是为什么您允许用户输入任意 URL 并在不检查的情况下下载它。 URL 可以很容易地成为数 GB 的二进制文件。您的第一行表明您打算使用 Google Maps API,AFAIK 不会返回过大的行,从而导致 DOS 问题没有实际意义(除了在一些超安全的应用程序中,我认为 android 不适合使用)。
【讨论】:
以上是关于如何防止android中的拒绝服务(DOS)攻击?的主要内容,如果未能解决你的问题,请参考以下文章