【问题标题】:Your app(s) are using a content provider that contains a SQL Injection vulnerability您的应用正在使用包含 SQL 注入漏洞的内容提供程序
【发布时间】:2018-08-01 10:43:30
【问题描述】:

我有 2 个应用程序。第二个应用程序通过内容提供程序与第一个应用程序交互以获取一些凭据。今天在 playstore 上传我的 apk 时出现错误-SQL 注入 您的应用正在使用包含 SQL 注入漏洞的内容提供程序。 要解决此问题,请按照此Google Help Center article 中的步骤操作。

现在我执行了文章中提到的所有步骤,但仍然遇到相同的错误。具体步骤如下:

如果受影响的 ContentProvider 需要暴露给其他应用:

  • 您可以使用
    防止 SQL 注入 SQLiteDatabase.query 带有投影图的严格模式。严格模式防止
    恶意选择子句和投影图防范
    恶意投影条款。您必须同时使用这两个功能才能 确保您的查询是安全的。

  • 您可以防止 SQL 注入到 SQLiteDatabase.update 和 SQLiteDatabase.delete 使用使用“?”的选择子句 作为可替换参数和单独的选择数组 论据。不应构建您的选择子句 来自不受信任的输入。

我的 SQLiteQueryBuilder 带有 set strict = true 和投影图。

    private static final HashMap<String,String> values;
    static {
        values = new HashMap<String, String>();
        values.put("_id", "_id");
        values.put("name", "name");
    }

        @Override
        public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
            SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
            qb.setTables(TABLE_NAME);
            qb.setStrict(true);


        switch (uriMatcher.match(uri)) {
            case uriCode:
                qb.setProjectionMap(values);
                break;
            default:
                throw new IllegalArgumentException("Unknown URI " + uri);
        }

        if (sortOrder == null || sortOrder == "") {
            sortOrder = name;
        }
        Cursor c = qb.query(db, projection, selection, selectionArgs, null,
                null, sortOrder);
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
    }

【问题讨论】:

  • 你的问题解决了吗?
  • 是的,我已经解决了这个问题。
  • @RishabhLashkari 你能分享你的解决方案吗? (我自己也有同样的问题)。谢谢!
  • @sunyata 我不得不想办法找到答案。尽管我的提供者从未使用过更新和删除查询,但我应该以 Pitos 提到的方式编辑它们。所以不能有任何带有sql漏洞的查询,严格模式必须为真,并且必须使用投影图。

标签: android


【解决方案1】:

这不是答案。 (我没有足够的声誉发表评论)。看起来该错误仅与内容提供程序中定义的更新和删除有关。上面的代码只是返回数据。我建议回到您的每个内容提供商并检查:

delete(Uri var1, String var2, String[] var3)
update(Uri var1, ContentValues var2, String var3, String[] var4);

TABLE_ID 案例应该有你提到的定义的选择和选择参数。在我最近的应用程序中,我定义了“=?”例如删除,但在调用 ContentResolver 时使用了 .delete(object_Url, null, null)。如果 object_Url 与 id 匹配,则对其进行解析并返回选择参数,例如

selection = CONTRACT._ID + "=?";
selectionArgs = new String[] {String.valueOf(ContentUris.parseId(uri))};

【讨论】:

  • 嗨皮托斯。这些更改是否需要在我们覆盖查询、删除和更新方法的 ContentProvider 类中进行,或者在我们调用这些方法的代码中的任何地方进行?我已经在用了?当我通过选择语句但我的应用仍然在 PlayStore 中被拒绝时,这就是为什么我想知道是否需要更改 ContentProvider 类本身。
  • 仅在扩展 ContentProvider 的类中,您可以覆盖更新、删除等。我的应用在 Google Play 中仍然可以正常工作。但是,如果您仍然遇到问题,我建议您切换到 Room。使用起来更容易。
  • 感谢您的回复,皮托斯。每次我修改这个类时,我的查询都会停止工作,我一遍又一遍地尝试,但我无法弄清楚。我知道我问了很多,但是如果您可以查看我的 sn-p 并至少建议我为其中一种方法做什么,我相信我会找出其他方法。测试类在这里gist.github.com/Buli1212/d489e8c67c3fde08e1fd08f30a759e28
  • 1.您不会在 onCreate 的 try/catch 中处理异常。 2. 为什么不使用常量的内容权限呢? (在您的情况下为 PROVIDER_NAME)。 3.避免!尽可能先在 onCreate 中添加断点,然后在每个 ContentProvider 方法中添加断点
  • 感谢您的代码审查 :) 我已经尝试调试每种方法,但它并没有让我更接近于使其 SQL 注入安全。当我调用这些方法时,我使用带参数的参数化查询,但不在我共享的 Content Provider 类中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 2019-04-05
  • 1970-01-01
  • 2018-12-09
  • 2022-01-21
相关资源
最近更新 更多