【问题标题】:Should I trim values in SQL or ColdFusion?我应该修剪 SQL 或 ColdFusion 中的值吗?
【发布时间】:2017-01-20 01:04:37
【问题描述】:

我已经完成了许多插入/更新,我一直在想的问题是我应该在哪里修剪我正在插入或更新的值。在这种情况下,我使用 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 插入语句中在那里或下面进行修剪吗?什么是更好和更有效的?如果有人可以提供帮助,请告诉我。谢谢。

【问题讨论】:

  • 为什么不编码两种方式,用计时器包装它们,然后循环数千次,看看哪一种更快?我的猜测是,这并不重要。另外,请使用cfqueryparam 进行数据库输入。它不仅可以保护站点免受 SQL 注入,还可以重写 userdob 语句,使其更具可读性 &lt;cfqueryparam value="#userdob#" null="#len(userdob) EQ 0#" /&gt;null 属性是一个布尔值,当为 true 时将发送 NULL 而不是值。
  • 两者都不是。在我们的主要应用程序中,我们在表单字段的 onBlur 事件中修剪用户输入。我们已设法将其放入 Application.cfm 或 cfc 文件中,因此它是自动的。另外,在您的示例中,如果 dob 代表出生日期,则尝试将日期存储为字符串是比空格更严重的问题。
  • 有没有地方可以看到这个修剪onBlur()
  • 我们的函数是在 10 多年前编写的,但这里是更新的。 stackoverflow.com/questions/498970/trim-string-in-javascript
  • onBlur 解决方案将起作用,但请记住,它运行客户端。我总是建议在服务器端运行任何类型的数据清理或验证,以配合任何客户端代码。服务器将确保任何不良数据不会被传递,客户端代码将确保更好的用户体验。

标签: sql-server coldfusion sql-insert


【解决方案1】:

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

&lt;cfset form[local.field] = trim(getSafeHTML(form[local.field]))&gt;

更多信息在这里: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>
)

【讨论】:

  • 一个问题,如果我运行我的插入语句并且所有数据将从不同的数据库中填充(因此没有用户输入字段/变量)。在这种情况下我需要'cfqueryparam'吗?我还应该修剪 cfquery 中的所有值并将修剪放在我将使用的所有数据字段周围吗?这样我认为就足够了,之后我不需要冷融合修剪。也许我错过了一些东西,如果你能提供任何有帮助的反馈。谢谢!
  • 您应该始终使用cfqueryparam,这只是一种很好的做法,有时不知道其他表中的数据来自何处。如果您首先不确定数据是如何输入的,或者如果数据库列使用char 而不是varchar,您应该只在数据库中执行trim()char 列有时会添加填充以弥补为其定义的最大字符数。
【解决方案2】:

尝试在 ColdFusion 上处理服务器端的修剪。数据在插入数据库之前需要经过验证。

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

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

HTH。

【讨论】:

    【解决方案3】:

    即使您在&lt;cfquery&gt; 中使用“#trim(someVar)#”,您仍在 ColdFusion 中进行修剪。所以让我把你的问题改写为:

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

    最好的答案是:在将值传递到数据库之前使用 ColdFusion 修剪这些值。这符合至少 3 种 GRASP 模式(GRASP = General Responsibility Assignment Software Patterns):

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

    2. Low Coupling:不同的数据库品牌一般有不同的修整功能。在cfquery 中实现任何此类功能 将暗示 ColdFusion 对特定的 数据库品牌。这种亲密感会增加耦合度。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-06
      • 2010-11-06
      • 2011-06-03
      • 2017-01-26
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多