sql - 为什么 ColdFusion 哈希函数在这些场景中会返回不同的结果?

标签 sql hash parameters coldfusion coldfusion-8

这是我第一次注意到 ColdFusion 的这种行为。我在更新查询以使用 <cfqueryparam> 时遇到了这个问题.该代码在 ColdFusion 8 平台上运行。我没有此版本之外的行为引用。

此外,我们通常会使用 <cfqueryparam>对于插入的值,这是促使调查此问题的原因。

对于这个例子,我们假设“first_string”和“second_string”包含一些文本,例如标题和一些带有来自 <textarea> 的换行符的段落文本。分别形成帖子。

我们还可以假设“md5_hashed_value”列的 SQL 数据类型是 char(32)。

场景 1:

<cfset hashed_value = hash(first_string & second_string, "MD5")>
<cfquery name="my_query" datasource="#my_datasource_name#">
    INSERT INTO my_table
    (
        md5_hashed_value
    )
    VALUES
    (
        '#hashed_value#'
    )
</cfquery>

在上面的第一个场景中,创建了一个散列值。

场景 2:

<cfquery name="my_query" datasource="#my_datasource_name#">
    INSERT INTO my_table
    (
        md5_hashed_value
    )
    VALUES
    (
        '#hash(first_string & second_string, "MD5")#'
    )
</cfquery>

在第二种情况下,计算出的散列值与第一种情况不同。

场景三

<cfquery name="my_query" datasource="#my_datasource_name#">
    INSERT INTO my_table
    (
        md5_hashed_value
    )
    VALUES
    (
        <cfqueryparam value="#hash(first_string & second_string, "MD5")#" CFSQLType="CF_SQL_CHAR">
    )
</cfquery>

在第三种情况下,插入数据库的值与第一种情况中插入的值相同。

为什么会这样? hash() 函数在所有情况下都以相同的方式被调用。它在代码中的位置是唯一的区别。当在 SQL 查询中直接调用 hash() 而不是通过 <cfqueryparam> 调用时,似乎发生了一些奇怪的事情。值或 <cfset> .

最佳答案

这是我半生不熟的猜测。

<cfquery></cfquery><cfsavecontent></cfsavecontent> 不完全相同.我不认为 &正在进行正常的字符串连接。所以这是对我的假设的检验。试试这些:

<cfset hashed_value = hash("" &first_string & second_string, "MD5")>
<cfquery name="my_query" datasource="#my_datasource_name#">
    INSERT INTO my_table
    (
        md5_hashed_value
    )
    VALUES
    (
        '#hashed_value#'
    )
</cfquery>

这和以前一样吗?我怀疑是这样。

<cfquery name="my_query" datasource="#my_datasource_name#">
    INSERT INTO my_table
    (
        md5_hashed_value
    )
    VALUES
    (
        '#hash("" & first_string & second_string, "MD5")#'
    )
</cfquery>

这和以前一样吗?我怀疑它没有。

解决方法

<cfquery name="my_query" datasource="#my_datasource_name#">
    DECLARE @md5_hashed_value = '#hash(first_string & second_string, "MD5")#'

    INSERT INTO my_table
    (
        md5_hashed_value
    )
    VALUES
    (
        @md5_hashed_value
    )
</cfquery>

虽然这不具备 <cfqueryparam> 的所有优点,至少它参数化了你的查询

关于sql - 为什么 ColdFusion 哈希函数在这些场景中会返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59000217/

相关文章:

sql - PostgreSQL:选择整数作为日期或时间戳

sql - 运行平衡和数据库规范化范例

ruby - 将数组的值加到哈希中

c++ - 为什么只有一个参数的宏除了双括号外不能按预期工作?

parameters - 打开文件时指定监视器。 (。 bat )

sql - 如何使用 Oracle 索引

sql - 数据库中的死锁会影响其他数据库或挂起整个服务器吗?

c++ - 通过 local_it 遍历 bucket 时 unordered_multimap 中的碰撞

arrays - 根据阈值对整数应用不同的乘数

java - 还有另一种方法可以在 jquery 或表单提交中下载文件吗?