我目前正在将用户提交的数据存储到已编码的数据库中,如下所示:
<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()
收到的数据存储在数据库中?
答案 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