我应该修剪SQL或ColdFusion中的值吗?

时间:2017-01-20 01:04:37

标签: sql-server coldfusion sql-insert

我做了很多插入/更新和问题总是在我的脑海里,我应该修剪我正在插入或更新的值。在这种情况下,我使用ColdFusion作为我的服务器端编程语言,SQL Microsoft是我的数据库语言。所以,如果我正在插入,我应该修剪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语句中进行修改吗?什么是更好,更有效?如果有人可以提供帮助,请告诉我。谢谢。

3 个答案:

答案 0 :(得分:2)

尝试在ColdFusion上处理服务器端的修剪。在将数据插入数据库之前,需要对数据进行验证。

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

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

HTH。

答案 1 :(得分:2)

您可以使用onRequestStart()文件中的Application.cfc自动修剪所有表单字段。此代码在每个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注入攻击。
  3. 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>
    )

答案 2 :(得分:1)

即使您使用&#34; #trim(someVar)#&#34;在<cfquery>内,你仍然在修复ColdFusion。所以,让我把你的问题改为:

&#34;我应该在将值传递给数据库管理系统之前使用ColdFusion修剪值,还是应该传递未修剪的值并让数据库进行修剪?&#34;。

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

  1. 信息专家: ColdFusion是专家,他知道变量是什么,它来自哪里以及它的价值应该是什么。如 这样的ColdFusion应该进行修剪。

  2. 低耦合:不同的数据库品牌通常具有不同的修剪功能。在cfquery中实现任何此类功能 意味着ColdFusion对某个特定内容了如指掌 数据库品牌。这种亲密关系会增加耦合。

  3. 受保护的变体:假设在cfquery中的SQL中,您实现了一个特定数据库品牌的修剪功能。 然后,当您将数据库切换到品牌时,您的代码将会中断 修剪功能的定义不同。