gpt4 book ai didi

coldfusion - 如何应对这种 SQL 注入(inject)风险(Coldfusion)?

转载 作者:行者123 更新时间:2023-12-04 12:28:24 24 4
gpt4 key购买 nike

最近,我们聘请的一家安全风险公司发现了我们 Coldfusion 应用程序中某个函数的特定参数存在 SQL 注入(inject)风险。该参数被正确捕获为 cfargument:

<cfargument name="status" required="false" type="string">
并且还正确地参数化为 cfprocparam:
<cfif isDefined('ARGUMENTS.status') AND ARGUMENTS.status NEQ "">
<cfprocparam type="in" value="#ARGUMENTS.status#" dbvarname="@search_status" cfsqltype="cf_sql_varchar">
<cfelse>
<cfprocparam type="in" null="yes" dbvarname="@search_status" cfsqltype="cf_sql_varchar">
</cfif>
然后以这种方式在存储过程中使用它,为 SQL 查询构建一个 where 子句:
if (len(@search_status) > 0)
begin
set @strWhere = @strWhere + ' AND e1.cps_txt LIKE '+ '''%'+@search_status+'%'''
end
当然,参数化以确保值是 varchar 并不能阻止输入和传递一串恶意代码。这似乎也很容易成为一个更大的问题,因为它远不是我们应用程序中唯一将字符串参数传递给 cfc 函数然后在 SQL 查询中使用的地方。
我想知道在这种情况下补救安全风险的最佳方法是否是将参数的值与所有可能的预期值进行比较(大约有 20 个,存储在表中),如果不匹配其中之一,然后抛出一个错误,或者只是传递给存储过程为空。

最佳答案

不得不在以前的雇主那里解决这个问题。诀窍是通过truefalsenull参数并避免编写所有这些调用不同版本 procparam 的条件代码有或没有属性。只需始终拥有属性并将条件逻辑放入值中即可。

<cfprocparam type="in" 
dbvarname="@search_status"
cfsqltype="cf_sql_varchar"
value="#ARGUMENTS.status#"
null="#!(structKeyExists(arguments, "status") AND (len(arguments.status) NEQ 0))#">
根据条件的复杂程度,您可以简单地将其作为变量传递。
<cfset statusNull = true>
<cfif structKeyExists(arguments, "status") AND (len(arguments.status) NEQ 0)>
<cfset statusNull = false>
</cfif>

<cfprocparam type="in"
dbvarname="@search_status"
cfsqltype="cf_sql_varchar"
value="#ARGUMENTS.status#"
null="#statusNull#">
我想重申来自 SOS 的评论,其中提到了动态 SQL。我们还从数以千计的存储过程中消除了动态 SQL,并用来自他的链接消息的条件检查取而代之。这比处理大量的字符串连接代码更容易阅读和调试。
WHERE ( @OrderId IS NULL OR tblOrder.OrderId = @OrderId )
AND ( @OrderCustomer IS NULL OR tblOrder.OrderCustomer = @OrderCustomer )
在将参数传递给 this 函数/过程之前,我也会避免添加查询只是为了查找状态的有效值。每次调用此进程时,这只会增加系统开销。

关于coldfusion - 如何应对这种 SQL 注入(inject)风险(Coldfusion)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68657859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com