Coldfusion应用中如何阻止未登录用户直接通过URL访问文件?
IIS下Coldfusion应用assets目录权限配置方案
针对未登录用户可直接访问assets目录下文件的问题,提供三种可行配置方案:
方案一:URL重写+Coldfusion登录验证
通过IIS的URL重写把assets文件请求转发到Coldfusion脚本,验证用户登录状态:
- 确保Coldfusion会话已开启,登录成功后在会话中标记用户状态(例如
session.isLoggedIn = true) - 在站点根目录的
web.config中添加重写规则:
<rule name="Protect Assets" stopProcessing="true"> <match url="^assets/(.*)$" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" /> </conditions> <action type="Rewrite" url="/verifyAssetAccess.cfm?path={R:0}" /> </rule>
- 创建
verifyAssetAccess.cfm验证脚本:
<cfif NOT structKeyExists(session, "isLoggedIn") OR NOT session.isLoggedIn> <cfheader statuscode="403" statustext="Forbidden"> <cfoutput>403 - 无权访问</cfoutput> <cfabort> </cfif> <cfset filePath = expandPath("/" & url.path)> <cfif fileExists(filePath)> <cfcontent file="#filePath#" type="#getPageContext().getMimeType(filePath)#" deletefile="no"> </cfif> <cfabort>
方案二:IIS授权规则(需关联Coldfusion认证)
如果Coldfusion登录后生成的认证Cookie(如CFID/CFTOKEN或自定义Cookie)可被IIS识别,可直接通过IIS配置拦截匿名访问:
- 在assets目录下新建
web.config,添加授权规则:
<configuration> <system.webServer> <security> <authorization> <deny users="?" /> <!-- 拒绝所有匿名用户 --> </authorization> </security> </system.webServer> </configuration>
- 配置IIS与Coldfusion的认证关联,确保IIS能识别Coldfusion的登录用户(可通过自定义模块读取Coldfusion会话状态实现)
方案三:Application.cfc全局拦截
修改Coldfusion的Application.cfc,在请求开始时验证assets路径的访问权限:
- 在
Application.cfc的onRequestStart方法中添加判断逻辑:
<cffunction name="onRequestStart" returnType="boolean" output="false"> <cfargument name="targetPage" type="string" required="true"> <cfif findNoCase("/assets/", cgi.script_name) OR cgi.script_name EQ "/assets/"> <cfif NOT structKeyExists(session, "isLoggedIn") OR NOT session.isLoggedIn> <cfheader statuscode="403" statustext="Forbidden"> <cfoutput>403 - 无权访问</cfoutput> <cfreturn false> </cfif> </cfif> <cfreturn true> </cffunction>
- 确保静态文件请求经过Coldfusion处理,在站点根目录
web.config中添加处理器配置(路径替换为你的Coldfusion ISAPI模块实际路径):
<handlers> <add name="ColdfusionStaticFiles" path="assets/*" verb="GET,HEAD" modules="IsapiModule" scriptProcessor="C:\ColdFusion2021\config\wsconfig\1\jrun_iis6.dll" resourceType="File" requireAccess="Read" /> </handlers>
内容的提问来源于stack exchange,提问作者Harsha vardhan
相关产品推荐
相关产品推荐

