bwh*_*het 2 sql coldfusion sql-injection cfml
我有点羞怯地问这个问题,因为我应该知道答案.有人可以善解并解释以下代码中是否以及如何进行注射?
<cfquery>
select * from tableName
where fieldName = '#value#'
</cfquery>
Run Code Online (Sandbox Code Playgroud)
我特别好奇注入尝试和其他恶意输入,而不是关于处理"正常"用户输入的最佳实践或输入验证.我看到人们强烈主张使用CFQueryParam,但我认为没有看到这一点.如果用户输入已经过验证,以确保数据库模式的一致性(例如,输入必须是数字数据库字段的数字),那么使用CFQueryParam还有其他什么吗?这是什么<cfqueryparam CFSQLType = "CF_SQL_VARCHAR">做的'#value#'没有做?
更新:
虽然这回答了你问题的一部分,但Peter的回答更好,因为它直接解决了你的问题"为什么使用cfqueryparam,当CF通过转义单引号自动添加保护?".答:简而言之,因为后者并不总是有效.绑定变量.
它在文档中说"在单引号中转义字符串变量"但是当你用单引号包装评估变量时,CF是否已经"神奇地"在CF查询标记中执行此操作?
是的,大多数版本会自动转义单引号作为不使用cfqueryparam的保护措施.但是,正如Scott上面提到的,最好使用cfqueryparam(即绑定变量),因为它们确保参数不会作为sql命令执行.正如Peter的回答所示,即使在自动转义没有的情况下,绑定变量也能正常工作.
也就是说,sql注入保护实际上只是使用绑定变量的副作用.使用绑定变量的主要原因是性能.绑定变量鼓励数据库重用查询计划,而不是每次#参数#更改时创建新计划.这减少了编译时间,提高了性能.
Cfqueryparam还有许多其他好处:
null值的处理的属性虽然它并不真正适用于字符串列,但IMO使用它的另一个重要原因是准确性.将带引号的字符串传递给数据库时,您依赖于隐式转换.基本上你是把它留给数据库来弄清楚如何最好地进行比较,结果并不总是你所期望的.(日期字符串是一个主要的例子).您可能会以不准确的结果或有时较慢的查询结束,具体取决于数据库决定如何执行sql.使用cfqueryparam通过消除歧义来避免这些问题.
| 归档时间: |
|
| 查看次数: |
977 次 |
| 最近记录: |