编码用户输入的时间和位置?

时间:2015-06-03 22:54:08

标签: forms encoding coldfusion coldfusion-10 coldfusion-11

我目前正在将用户提交的数据存储到已编码的数据库中,如下所示:

<cfquery>
INSERT INTO dbo.MyTable (UserID, Comment)
VALUES
(
<cfqueryparam value="#FORM.UserID#" cfsqltype="cf_sql_integer"/>,
<cfqueryparam value="#EncodeForHTML(FORM.Comment)#" cfsqltype="cf_sql_nvarchar"/>
)
</cfquery>

显然这不是正确的方法,因为现在我已经在数据库表中转义了字符,这些字符仅对HTML输出有用,并且难以在SQL Server中执行搜索。

那么我如何确保在输入到服务器之前对输入应用EncodeForHTML(),然后Canonicalize()收到的数据存储在数据库中?

2 个答案:

答案 0 :(得分:4)

当它朝向DB时,缓解潜在的DB有害文本:将其作为参数传递,而不是硬编码到SQL语句中,就像您在示例中所做的那样。您仍然通过不参数化您的ID值来暴露自己。通常,只有SQL应该包含在<cfquery>的SQL字符串中;任何数据值都应作为参数传递。

同样,降低用户提供的数据在您使用数据时可能会暴露的风险。不是在它进入存储时,而是在你真正使用它的时候。 encodeForHtml()仅适用于写入HTML的内容。如果它在URL上传递或在JavaScript中使用等,则没有任何帮助。对于那些(urlEncodedFormat()encodeForJavaScript()分别有不同的缓解方法)。关键是你在逐个使用的基础上处理缓解,而不仅仅是一般。

如何确保完成(你问这个)?嗯...你勤奋地编写代码并进行严格的代码审查和质量检查流程(QA正在进行笔测试)。

答案 1 :(得分:1)

您可以按原样存储它们,也可以<cfqueryparam>使用form.userid。在输出时,您使用encodeforhtml()

如果您希望在存储之前完成一些数据清理,请尝试AntiSamy(内置于CF11中)http://www.adobe.com/devnet/coldfusion/articles/security-improvements-cf11.edu.html#articlecontentAdobe_numberedheader_2