针对SQL注入漏洞的典型控制是使用绑定变量(cfqueryparam标记),字符串数据验证以及转向实际SQL层的存储过程.这很好,我同意,但如果该网站是遗留的,它具有很多动态查询.然后,重写所有查询是一项艰巨的任务,需要进行大量的回归和性能测试.我正在考虑使用动态SQL过滤器并在调用cfquery之前调用它以进行实际执行.
我在CFLib.org(http://www.cflib.org/udf/sqlSafe)中找到了一个过滤器:
<cfscript>
/**
* Cleans string of potential sql injection.
*
* @param string String to modify. (Required)
* @return Returns a string.
* @author Bryan Murphy (bryan@guardianlogic.com)
* @version 1, May 26, 2005
*/
function metaguardSQLSafe(string) {
var sqlList = "-- ,'";
var replacementList = "#chr(38)##chr(35)##chr(52)##chr(53)##chr(59)##chr(38)##chr(35)##chr(52)##chr(53)##chr(59)# , #chr(38)##chr(35)##chr(51)##chr(57)##chr(59)#";
return trim(replaceList( string , sqlList , replacementList ));
}
</cfscript>
Run Code Online (Sandbox Code Playgroud)
这似乎是一个非常简单的过滤器,我想知道是否有办法改进它或提出更好的解决方案?
我正在尝试使用此行构建动态sql语句
<cfset SQL = "SELECT url, MONTH(event_date) AS months, YEAR(event_date) AS year, event_date, title from events where title LIKE '%#form.event_name#%' ">
<cfquery name="results" >
#SQL#
</cfquery>
Run Code Online (Sandbox Code Playgroud)
似乎like子句有问题.有任何想法吗?我是否需要逃避%?
谢谢
在对MySQL进行cfquery时,MYSQL在以下代码中给出了'字段列表'中的错误未知列'问题':
<cfquery name="qUpdateTheQuestion" datasource="testmaster">
INSERT INTO ETrueFalseQuestions
VALUES (<cfoutput>#newTypeID#</cfoutput>, `<cfoutput>#FORM.Question#</cfoutput>`, <cfoutput>#FORM.truefalse#</cfoutput>
Run Code Online (Sandbox Code Playgroud)
我尝试了所有我想到的尝试来解决这个问题,以及我在尝试搜索解决方案时发现的一些建议,例如使用反引号而不是单引号.
我也不明白为什么它会搜索名为Question的列,因为这是FORM.Question的值,并根据输入到表单中的内容而更改.任何建议将不胜感激.
我正在尝试首先检查NULL,如果值为NULL,则跳过INSERT.但这不是正在发生的事情.即使我没有在表单字段中输入任何内容,代码也会插入NULL记录.这几乎就像是在认识到不存在的东西.
<cfoutput>
<cfif form.TBCom is not "">
<cfquery name="TestTBComm" datasource="TrenaTest">
INSERT INTO Comment1 (
UniqueNum,
ComTyp,
Comments )
SELECT
'#UniqueNum#',
'#TBComV#',
'#TBCom#'
</cfquery>
</cfif>
</cfoutput>
Run Code Online (Sandbox Code Playgroud) 当我执行存储过程通过时cfstoredproc,我得到的结果不同于调用存储过程通过cfquery.我正在向每个调用传递相同的确切参数值.而且,当我在SQL Studio中运行存储过程时,我得到了正确的结果(与cfquery相同).
这是cfstoredproc电话
<cfstoredproc datasource="#request.mainDSN#" debug="#request.debug#" procedure="rankingresults">
<cfprocparam type="in" value="8652" CFSQLType="CF_SQL_INTEGER">
<cfprocparam type="in" value="50" CFSQLType="CF_SQL_INTEGER">
<cfprocparam type="in" value="53" CFSQLType="CF_SQL_INTEGER">
<cfprocresult name="local.listing">
</cfstoredproc>
Run Code Online (Sandbox Code Playgroud)
这是cfquery电话
<cfquery datasource="#request.mainDSN#" name="rankings">
EXEC rankingresults
@CityZipId = 8652,
@distance = 50,
@sic = 53
</cfquery>
Run Code Online (Sandbox Code Playgroud)
结果完全不同.它甚至都不是很接近.我已经被我的头撞了几个小时了,我无法弄清楚它为什么要做它正在做的事情.
UPDATE
存储的proc很大(我继承了一个),所以我不打算将它全部粘贴在这里:http://pastebin.com/EtufPWXf
我有一些大的查询和循环,这给了我一个excel输出.
我在excel一代的表现上遇到了麻烦.这需要很多时间.所以我想到了优化代码,为此我想知道我的代码块占用了多少时间?请问身体有什么帮助吗?
我只是想知道如何转储cfquery/cfloop/cfoutput的执行时间......?
我最近运行了一个应用程序扫描(IBM),现在我正在尝试修复出现的问题.我的大部分问题源于cfquery(见下文).我试图得到它,以便存储的XSS和SQL注入问题不会出现在我的扫描上.任何帮助将不胜感激,因为这是我第一次做某种事情.
谢谢!
<cfquery name="enter_question" datasource="#dsn#">
INSERT INTO xx_questions(q_id,
q_name,
q_narrative,
q_used,
q_type)
VALUES( #variables.new_q_id#,
'#form.q_name#',
'#form.q_narrative#',
'n',
#form.q_type#)
</cfquery>
Run Code Online (Sandbox Code Playgroud) 一,代码.我正在制作一个查询结构:
<cfset myQueryStruct = {
qone = "select * from t1 where column = <cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>",
qtwo = "select * from t2 where column = <cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>"
}>
Run Code Online (Sandbox Code Playgroud)
我需要动态执行查询,如下所示:
<cfquery name="qName" datasource="#dsn#">
#myQueryStruct[arguments.type]#
</cfquery>
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误:
Error Executing Database Query.
[Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near '<'.
Run Code Online (Sandbox Code Playgroud)
似乎错误与<cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>查询中的" "("<")有关
我尝试使用evaluate()并收到此错误:
Invalid CFML construct found on line 1 at column 15.
ColdFusion was looking at the following text:
t1
Run Code Online (Sandbox Code Playgroud)
我知道我们可以通过<cfif>在里面使用梯子来做到这一点,<cfquery>但我的问题是,我们可以像我提到的那样 …
我有一个简单的查询,它通过ID来提取记录列表:
<cfquery name="resTotals" datasource="#datasource#">
SELECT ticket_id
FROM closed_tickets
WHERE YEAR(closed_date) = '2017'
AND ticket_type = 'residential'
</cfquery>
Run Code Online (Sandbox Code Playgroud)
然后我尝试在另一个不同表的查询中循环访问这些ID,以便检查是否存在付款记录.目标是总计所有支付记录,以获得支付美元的总金额.
我有这个查询,但它抛出一个错误:不能将字符串[99.00]转换为类型[数组]的值
<cfloop query="resTotals">
<cfquery name="resPaymentTotals" datasource="#datasource#">
SELECT payment_amount
FROM payments
WHERE ticket_id = #resTotals.ticket_id#
</cfquery>
</cfloop>
Amount of Sales: $ #ArraySum(resPaymentTotals.payment_amount)#
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我是在正确的轨道上吗?
我正在以谷歌更好的形式进行搜索,以便在coldfusion中对"查询"进行交流,因为我在公司工作的新人,我试图从CF获得更多
在这里我的尝试:
我的模特:
<cffunction hint="Foo" name="Foo" access="public" returntype="query">
<!--- Argumentos --->
<cfargument hint="Something" name="ArgComBus" type="string" required="no" default="">
<cfargument hint="Other thing" name="ArgPar" type="string" required="no" default="">
<cfscript>
queryService = new Query();
queryService.setSql("
SELECT
column1,
column2,
FROM
tab_bar
WHERE
1=1
#arguments.ArgComBus#
");
queryService.setDataSource(session.Dsn);
if(Len(Trim(arguments.ArgPar))){
Evaluate(arguments.ArgPar);
}
queryResult = queryService.execute();
qBus = queryResult.getResult();
</cfscript>
<cfreturn qBus>
</cffunction>
Run Code Online (Sandbox Code Playgroud)
我的剧本
<cfscript>
arrFoo = arrayNew(1);
qFoo = this.Foo(
ArgComBus = " AND column1 = #variables.bar# ");
// First Attempt - The each method was not found.
qFoo.each(function …Run Code Online (Sandbox Code Playgroud) cfquery ×10
coldfusion ×10
cfloop ×2
mysql ×2
cfqueryparam ×1
cfstoredproc ×1
coldfusion-8 ×1
null ×1
owasp ×1
refactoring ×1
sql-like ×1
t-sql ×1
xss ×1