我目前正在将用户提交的数据存储到我的数据库中,这些数据已经编码如下:
<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()
将接收到的数据存储在数据库?
最佳答案
当文本指向数据库时,减轻对数据库有害的文本:将其作为参数传递,而不是硬编码到 SQL 语句中,就像您在示例中所做的那样。如果不参数化您的 ID 值,您仍然会暴露自己。通常,只有 SQL 应该出现在您的 <cfquery>
中。的 SQL 字符串;任何数据值都应作为参数传递。
同样,降低用户提供的数据在您使用数据时可能暴露的风险。。不是当它进入存储时,而是当您实际使用它时。 encodeForHtml()
仅适用于写入 HTML 的内容。如果它通过 URL 传递或在 JavaScript 中使用等,则没有任何帮助。针对这些问题有不同的缓解方法(分别为 urlEncodedFormat()
和 encodeForJavaScript()
)。重点是您要根据使用情况来处理缓解措施,而不仅仅是一般性的。
如何确保完成此操作(您问这个)?嗯...您勤奋地编写代码,并有严格的代码审查和 QA 流程(QA 进行笔测试)。
关于forms - 何时何地对用户输入进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30632221/