使用cferror后Coldfusion应用日志是否停止记录数据库错误?
问题描述
- 近期在ColdFusion环境中,CF Admin的应用日志(
application.log)原本可显示网站遭遇SQL注入尝试的页面、行号及无效数据。 - 为避免向用户展示标准ColdFusion错误信息,在
application.cfm中配置了全局数据库异常处理器:
<cferror template = "myDBErrorHandler.cfm" type = "exception" exception = "database">
- 该处理器运行正常,但发现
cfqueryparam捕获的SQL注入无效数据错误,不再写入application.log,仅能在包含完整堆栈跟踪的exception.log中找到相关记录。由于exception.log内容臃肿不便查看,而application.log的条目更简洁易用,因此产生以下疑问:- 这种行为是否属于ColdFusion的预期表现?
- ColdFusion官方文档中是否有相关说明?
- 在处理器模板中使用
cflog创建专用日志文件记录此类错误,是否可行?
解答
1. 是否为预期行为?
是的,这是ColdFusion的预期行为。当通过type="exception"的cferror自定义捕获特定类型异常后,ColdFusion会判定该异常已被业务逻辑处理,因此默认不再将其写入application.log——application.log的设计定位是记录未被自定义处理的顶层错误。而exception.log则负责留存所有被捕获异常的完整细节(包括堆栈跟踪),这是两者的职责划分导致的差异。
2. 文档说明
ColdFusion官方文档中关于cferror的章节明确提到:当使用type="exception"的cferror拦截异常时,会覆盖默认的错误日志写入行为,阻止异常信息进入application.log,仅会将完整异常数据写入exception.log。核心逻辑是自定义异常处理器接管错误后,默认的基础日志记录流程会被中断。
3. 替代方案可行性
完全可行。在myDBErrorHandler.cfm中使用cflog记录SQL注入拦截错误,是针对性解决该问题的最优方案之一。你可以自定义日志文件名(例如sql-injection-attempts.log),并按需记录关键信息(请求页面、行号、无效数据、时间戳等),既避开了exception.log的臃肿问题,又能生成简洁易读的专用日志,便于后续分析。
示例代码(添加至myDBErrorHandler.cfm):
<cflog file="sql-injection-attempts" text="SQL注入尝试:页面=#cgi.script_name#,行号=#exception.tagContext[1].line#,无效数据=#exception.detail#" type="Warning">
内容的提问来源于stack exchange,提问作者Cmaso
相关产品推荐
相关产品推荐

