【问题标题】:How do SQL parameters work internally?SQL 参数在内部如何工作?
【发布时间】:2009-10-07 19:31:58
【问题描述】:

当我们遇到一个关于 SQL 注入的问题时,我和一位同事正在浏览 SO,这让我们想知道:参数化查询如何在内部工作?您正在使用的 API(假设它支持参数化查询)是否执行连接,将查询与参数结合起来?或者参数是否与查询分开进入SQL引擎,根本不执行连接?

Google 提供的帮助不是很大,但也许我们没有找到合适的东西。

【问题讨论】:

    标签: sql-server parameterized


    【解决方案1】:

    参数使其与查询分开进入 SQL 引擎。为参数化查询计算或重用的执行计划,然后由带参数的sql引擎执行查询。

    【讨论】:

      【解决方案2】:

      参数完整地传递到 SQL 服务器,并单独“打包”与指示其类型的元数据,无论是输入还是输出等。正如 Alex Reitbort 指出的那样,之所以如此,是因为参数化语句是服务器级别的概念,而不是只是一种从各种连接层调用命令的便捷方式。

      【讨论】:

        【解决方案3】:

        我怀疑 SQL SERVER 从参数列表连接的给定参数化查询构建完整的查询字符串。

        它很可能会解析给定的参数化命令字符串,根据保留字和符号(SELECT、FROM、“、”、“+”等)将其拆分为内部数据结构。在该数据结构中,有诸如表名、文字等值的属性/位置。正是在这里,它将每个传入的参数(从列表中)复制(逐字)到该结构的适当部分。

        所以你的@UserName 值为:'x';delete from users --

        in 永远不需要转义,只是用作它真正的字面值。

        【讨论】:

          【解决方案4】:

          参数随查询一起传递(不在查询内),并在根据底层数据库通信协议发送时由 API 自动转义。

          例如,您可能有

          Query: <<<<select * from users where username = :username>>>>
          Param: <<<<:username text<<<<' or '1' = '1>>>>>>>>
          

          这不是任何数据库协议实际使用的确切编码,但你明白了。

          【讨论】:

            猜你喜欢
            • 2015-09-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-25
            • 2014-11-22
            • 2017-06-05
            相关资源
            最近更新 更多