如果我有一个带有SQL代码的变量,例如 #PreserveSingleQuotes(arguments.sql)#
#PreserveSingleQuotes(arguments.sql)#
运行此代码的最佳方法是什么?
如果可能进行SQL注入攻击,是否有一种方法可以运行此程序?
#1是一个有趣的问题,因为您没有很多选择。从ColdFusion的角度来看,您可以通过<cfquery>或通过运行它Query.cfc。另外,DB系统将能够采用包含SQL的字符串并执行它,但这实际上只是将问题从CF稍微抽象到了DB。我不确定还有其他选择。
<cfquery>
Query.cfc
就#2而言,这在使用时是一个大问题,<cfquery>因为没有缓解SQL注入的好方法(至少是明智的方法)(当然也没有优化SQL编译过程的方法),因为这是参数化值的唯一方法在语句中通过via <cfqueryparam>,并且不能将它们嵌入到充满SQL的字符串中。这里的解决方案是使用Query.cfc(我不建议使用,Query.cfc因为它涉及CFML语言中最差实现的部分IMO),因为可以在SQL字符串中指定位置或命名参数,然后传递该参数值分开。
<cfqueryparam>
最后,您始终应该始终将值作为参数传递,而不是在SQL语句中手工编码它们,如果这意味着不对SQL语句使用预先创建的字符串,那就可以了。