【问题标题】:How to prevent WiQL injection如何防止 WiQL 注入
【发布时间】:2021-03-13 14:55:32
【问题描述】:

我一直在互联网上搜索 WiQL 注入保护指南,但尚未找到任何内容。这适用于以前称为 Visual Studio Team Services (VSTS) API 的 Azure Dev Ops (ADO)。

对于这段代码,我应该如何防止 WiQL 注入? The documentation 在这里没有显示任何关于防止注入攻击的信息。这里有什么建议?只是防止 ' 字符?

        string projectName = "user supplied input";
        string tenantId= "user supplied input";

        var wiql = new Wiql()
        {
            Query = $@"Select [Id] From WorkItems 
                        Where [System.TeamProject] = '{projectName}' 
                        And [Custom.TenantId] = '{tenantId}'
                        Order By [State] Asc, [Changed Date] Desc"
        };

        // create instance of work item tracking http client
        var adoUri = new Uri($"{VSTS_URL}");
        using (var trackingClient = new WorkItemTrackingHttpClient(adoUri, credentials))
        {
            // execute the query to get the list of work items in the results
            var result = await trackingClient.QueryByWiqlAsync(wiql);
        }

【问题讨论】:

  • 能否详细说明“WiQL 注入保护”?您的意思是您不希望用户使用 DevOps REST api 运行查询吗?这里的WIQL只能查看工作项,不会向数据库注入任何数据。
  • 您的问题有什么更新吗?
  • 您希望用户能够为查询提供单个值。租户 ID。用户名。等等。你不希望他们能够指定“tenantId”或“1”=“1”并突然拉出大量条目。你知道的。标准 SQL 注入,但这次使用的是 WiQL。 @CeceDong-MSFT

标签: security azure-devops wiql


【解决方案1】:

在这种情况下,我将遵循这里的基础知识,参考 OWASP Guidelines around SQL injection 我们肯定可以采用以下两种做法。

  1. 转义所有用户提供的输入
  2. 白名单输入验证

白名单输入验证

可以通过将合法输入加入白名单来允许它们进入系统,白名单通常比黑名单更可靠,因为在这种情况下,有效组合的集合通常是有限的。这应该是任何情况下的主要防御措施,并且可以与其他输入验证技术结合使用。

转义所有用户提供的输入

这种技术的工作原理是这样的。每个系统都支持一种或多种特定于特定类型查询的字符转义方案。如果您随后使用正确的转义方案转义所有用户提供的输入,系统将不会将输入与开发人员编写的 WiQL 代码混淆。

更多关于支持的转义字符的参考可以从这里找到https://docs.microsoft.com/en-us/azure/devops/boards/queries/wiql-syntax?view=azure-devops

建议进一步阅读How to escape search strings in TFS Code Search

【讨论】:

    【解决方案2】:

    这里的WIQL只能查看工作项,它不会向数据库注入任何数据。它等同于从 Web 门户或受支持的客户端(例如 Visual Studio Team Explorer 和 Team Explorer Everywhere)创建查询。检查以下链接:

    https://docs.microsoft.com/en-us/azure/devops/boards/queries/using-queries?view=azure-devops

    默认情况下,具有利益相关者访问权限的所有项目成员和用户都可以查看和运行托管查询。如果您的意思是您不希望用户使用 DevOps REST api 运行工作项查询。您需要从团队项目中删除该用户。

    【讨论】:

    • 好的。假设tenantId 来自一个URL 参数。 /foo/someapi?tenantId=adsasdadasdasd' or '1' = '1 他们突然在查询中注入了额外的条件。我们希望以最安全的方式避免这种情况。通常你使用准备好的语句。我在这里没有看到任何准备好的语句库。
    • 默认情况下,所有项目成员和具有利益相关者访问权限的用户都可以查看和运行托管查询。可以查询所有支持的 WiQL。恐怕你不能限制 WiQL。
    • 我的回复有用吗?
    • 并非如此。我的一部分希望在将来他们添加注射保护的日期之前不回答这个问题。或者将其提供给任何可以提供一起破解的清理正则表达式的人。
    • 您可以在以下网站提交功能请求:developercommunity.visualstudio.com/content/idea/…
    猜你喜欢
    • 2020-12-15
    • 2010-10-26
    • 2015-09-07
    • 2011-06-21
    • 2011-10-02
    • 1970-01-01
    • 2013-05-20
    • 2020-09-08
    • 2011-11-03
    相关资源
    最近更新 更多