【问题标题】:ColdFusion 9 - prevent SQL injection while using dynamic table/view nameColdFusion 9 - 在使用动态表/视图名称时防止 SQL 注入
【发布时间】:2019-09-08 22:06:23
【问题描述】:

我不是 ColdFusion 开发人员,但我需要在一周内解决这个问题。

问题:我们的旧版应用程序通过 empid 创建视图,并使用记录的用户 ID 从视图中选择记录。

<cfset empid= session.emp_id>

那么这个变量用在cfquery as

Select columns from sometext_#empid#

这已被 Veracode 标记为 SQL 注入,并且在很多页面中都已完成,因此在所有查询中手动更改代码几乎是不可能的。

我将 #empid# 更改为 cfqueryparam,它不再被 Veracode 标记,但我读到这不是 cfqueryparam 的用途,我担心它可能会损坏

试图找到解决方案,但找不到与我的问题相近的任何东西。有什么方法可以验证cfset 标记本身的 SQL 注入,并希望 Veracode 理解不要标记此变量,或者解决此问题的正确方法是什么?

【问题讨论】:

  • 你从哪里读到cfqueryparam不是为了防止SQL注入?这确实是标签的用途之一。这已经被记录了好几次了。这是我 Google 的前 4 名 - ref 1ref 2ref 3ref 4
  • 可以在表名中使用查询参数吗?
  • 因为 Veracode 不再看到错误的模式。查询是否运行并返回结果?
  • 我用 cfqueryparam 更改了#empid# 1. 你能发布你的 cfquery 吗?您所描述的内容(即select column from table&lt;cfqueryparam...&gt;)不应该起作用 - 根本 ;-)。 Cfqueryparam 仅设计用于查询参数 - 而不是表名。 2.这些sql视图到底包含什么?

标签: coldfusion adobe sql-injection cfml veracode


【解决方案1】:

我已经通过几种方式解决了这个问题。最重要的是,在将 empid 的值作为表名的一部分传递时,您需要验证它是数字而不是字符串。这些扫描程序会寻找这些模式,但不会识别解决方案解决了这些问题。您可以让公司运行扫描或让您的安全团队验证该解决方案是否适用于 QA 测试。

对此的一种解决方案是使用函数包装查询(如果还没有的话)。函数参数验证传入的值只能是数字。数值不会导致 SQL 注入攻击。

<cffunction name="getEmployeeViewByID" access="public" output="false" returntype="query">
    <cfargument name="employee_id" type="numeric" required="true" hint="Employee ID">
    <cfquery name="local.q">
        SELECT * FROM sometext_#arguments.employee_id#
    </cfquery>
    <cfreturn local.q>
</cffunction>

<cfdump var="#getEmployeeViewByID(int(session.emp_id)#">

注意变量session.emp_idint() 函数包裹。该函数只允许一个数字作为参数。传入的任何字符串都会引发错误。我们经常实现该功能来验证查询字符串参数和其他可能发生 SQL 注入的地方的数值。

你也许可以摆脱这个:

Select columns from sometext_#int(empid)#

但这取决于所涉及的重构量。

【讨论】:

  • 这些扫描仪会寻找这些模式,但无法识别解决方案是否解决了它。 是的,这也是我在扫描其他语言方面的经验。 @Navi - 我知道时间可能不允许重构,但每个用户的视图有点不寻常。他们做了什么是普通的where 子句过滤器无法完成的?
猜你喜欢
  • 2023-03-10
  • 2018-08-16
  • 2018-08-21
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2016-11-16
相关资源
最近更新 更多