httpPlatformHandler服务端如何获取请求文件的完整物理路径
问题说明
当前使用C++结合httpPlatformHandler与Winsock开发Web服务端,程序已稳定运行,待解决问题为:如何从收到的HTTP请求中,得到请求目标文件对应的完整磁盘物理路径。
目前仅能从请求首行拿到URL相对路径,例如下方请求行仅能提取到/httpserver.pbh:
GET /httpserver.pbh HTTP/1.1
需要将该相对路径映射为类似C:\inetpub\wwwroot\httpserver.pbh的物理磁盘路径,已知ISAPI、FastCGI模式下可直接从IIS获取该路径值。
解决方法
httpPlatformHandler启动后端进程时,会由IIS自动注入当前应用的物理根路径环境变量,不需要额外在请求中解析,按以下步骤实现即可:
- 进程启动阶段,调用Win32 API
GetEnvironmentVariable读取APPL_PHYSICAL_PATH值,该值就是当前httpPlatformHandler挂载的站点/应用对应的根物理目录,默认IIS站点下该值为C:\inetpub\wwwroot\ - 收到HTTP请求后,从请求首行解析出URL路径段,先做路径安全校验:过滤所有
../、./类路径穿越字符,禁止路径跳出应用根目录 - 将校验通过的相对路径与之前拿到的
APPL_PHYSICAL_PATH做字符串拼接,再调用PathCchCanonicalize或等价路径规范化API处理,得到的就是目标文件的完整物理路径。
注意事项
- 必须做路径合法性校验:拼接完成后的最终路径,必须以
APPL_PHYSICAL_PATH的值为前缀,避免恶意构造的路径触发任意文件读取漏洞 - 如果站点配置了虚拟目录,httpPlatformHandler不会自动传递虚拟目录的物理映射,需要在站点的
web.config中手动将虚拟目录对应的物理路径配置为环境变量,启动时一并读取即可,配置示例:
<httpPlatform processPath="your_server.exe" arguments=""> <environmentVariables> <environmentVariable name="CUSTOM_VDIR_PATH" value="D:\virtual_dir_content\" /> </environmentVariables> </httpPlatform>
- 和ISAPI/FastCGI的实现差异:这两种是IIS原生扩展协议,IIS在请求转发阶段就会把解析完成的物理路径放在服务器变量中直接传给扩展程序;而httpPlatformHandler本质是反向代理托管,默认不会在转发的HTTP请求头中携带物理路径信息,通过启动时读取预注入环境变量做映射是官方推荐的实现方式,不需要额外修改请求转发规则。
内容的提问来源于stack exchange,提问作者Roland Smith
相关产品推荐
相关产品推荐

