我应该在 SQL 或 ColdFusion 中 trim 值吗?

Should I trim values in SQL or ColdFusion?

我已经做了很多 inserts/updates 并且一直在我脑海中浮现的问题是我应该 trim 我正在插入或更新的值。在这种情况下,我使用 ColdFusion 作为我的服务器端编程语言,SQL Microsoft 是我的数据库语言。因此,如果我正在插入,我应该 trim ColdFusion 中的值还是 SQL?我必须两者都做吗?什么更有效率?我想知道如果我遵循一些推荐的步骤,这是否可以提高效率。这是我的一个插入代码中的示例:

<cfset userphone = trim(user_phonenum)>
<cfset userdob = trim(user_dob)>

INSERT INTO  UserTest
  ( mm_phone,
    mm_dob
  )
VALUES
  (  
     '#trim(userphone)#',
      CASE WHEN LTRIM(RTRIM('#userdob#')) = '' THEN NULL ELSE LTRIM(RTRIM('#userdob#')) END
  )

在上面的代码中,我使用了 ColdFusion trim,我在其中设置了值 userphoneuserdob。我应该在 SQL Insert 语句中执行 trim 还是在下面执行?什么更好更有效?如果有人可以提供帮助,请告诉我。谢谢。

尝试在 ColdFusion 的服务器端处理 trim。数据在插入数据库之前需要进行验证。

你会说,我有客户端验证,但用户可以通过几个插件等轻松绕过这些验证。我会在 ColdFusion 级别处理 trim。

还有一点提示,我个人总是喜欢在实际插入之前处理验证或设置变量或任何条件逻辑等。插入应该只插入变量的值,如果可能的话,所有的预处理和验证都应该在你进入 cfquery 标签之前发生。

HTH.

您可以在 Application.cfc 文件中使用 onRequestStart() 自动 trim 所有表单域。此代码在每个 HTTP POST.

的顶部运行
<cffunction name="onRequestStart" returnType="boolean">
    <cfargument type="String" name="targetPage" required=true/>

    <cfif CGI.REQUEST_METHOD IS "POST">

        <cfloop collection= "#form#"  item="local.field">
            <cfset form[local.field] = trim(form[local.field])>
        </cfloop>

    </cfif>

    <cfreturn true>
</cffunction>

如果您使用的是 ColdFusion 11 或更高版本,您还可以使用本机 AntiSamy 函数擦除表单数据 getSafeHTML()。这会删除恶意 XSS 攻击代码。

<cfset form[local.field] = trim(getSafeHTML(form[local.field]))>

更多信息在这里:http://blogs.coldfusion.com/post.cfm/security-enhancements-in-coldfusion-splendor-pbkdf2-and-antisamy

那么,如果您的查询只是通过 CF 代码完成的,那么您应该

  1. 将您的变量限定在 form 范围内。
  2. 使用 cfqueryparam 来防止 SQL 注入攻击。
INSERT INTO  UserTest (
    mm_phone
    , mm_dob
)
VALUES (
    <cfqueryparam value="#form.userphone#" cfsqltype="cf_sql_varchar" />
    <cfif len(form.userdob) EQ 0>
        , <cfqueryparam cfsqltype="cf_sql_date" null="true" />
    <cfelse>
        , <cfqueryparam value="#form.userdob#" cfsqltype="cf_sql_date" />
    </cfif>
)

即使您在 <cfquery> 中使用“#trim(someVar)#”,您仍然在 ColdFusion 中 trimming。因此,让我将您的问题改写为:

"Should I trim values with ColdFusion before passing them to the Database Management System or should I pass the values untrimmed and let the database do the trimming?".

最佳答案是:trim 在将值传递到数据库之前使用 ColdFusion。这符合至少 3 个 GRASP 模式(GRASP = 一般责任分配软件模式):

  1. 信息专家: ColdFusion 是知道变量是什么、它来自哪里以及它的值应该是什么的专家。作为 这样的 ColdFusion 应该做 trimming.

  2. 低耦合:不同的数据库品牌一般对trimming有不同的功能。在 cfquery 中实现任何此类功能 会暗示 ColdFusion 对某个特定的事物了解得太多 数据库品牌。这种亲密会增加耦合。

  3. Protected Variation:假设,在cfquery中的SQL中,你实现了trimming函数一个特定的数据库品牌。 然后,当您将数据库切换到品牌时,您的代码将中断 trim 函数的定义不同。