如何防止Android中的拒绝服务(DOS)攻击?

时间:2018-07-19 07:42:58

标签: android bufferedreader readline denial-of-service

我在Android应用程序中使用过地图。我传递了原始和目标latlon并从地图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(),它将不受信任的数据附加到使用默认后备数组大小(16)初始化的StringBuilder实例。这可能会导致JVM过度使用堆内存空间。

1 个答案:

答案 0 :(得分:0)

如果您从未知的URL下载,则数据确实可以是任意的,并且BufferedReader.readLine()可能会遇到一行,只要程序无法处理它。 This question表示限制BufferedReader行长可能并不容易。

行数也可能太大,在这种情况下,用while循环中的行数检查而不是简单的空检查就足够了。

问题是为什么您要允许用户输入任意URL并下载它而无需检查。该URL可以很容易地是一个数GB的二进制文件。第一行表明您打算使用Google Maps API,AFAIK不会返回太大的行,从而引起DOS的关注(某些超级安全的应用程序除外,我认为Android不适合使用它)。