启用父路径对网站安全的详实介绍

来源:互联网 发布:淘宝杰斯伯官方旗舰店 编辑:程序博客网 时间:2024/06/06 16:08

对包含文件的深入了解:   
    
“Server-side   include”命令提供了一种方式,可在   Web   服务器处理文件之前在该文件中插入其他文件的内容。ASP   只执行该机制的   #include。要将文件插入   .asp   文件,可使用下面的语法:  
   
<!--   #include   virtual   |   file   ="filename"   -->  
关键字“virtual”和“file”表示用来包含文件的路径类型,“filename”表示想要包含文件的路径和文件名。  
   
被包含的文件并不要求具有特定的文件扩展名;但是,赋予被包含文件   .inc   的扩展名是一个良好的编程习惯,这样有助于将它们与其他类型的文件区分开来。  
   
使用   Virtual   关键字  
使用关键字“virtual”来表示以虚拟目录开始的路径。例如,如果文件   Footer.inc   驻留在虚拟目录   /Myapp   中,则下面的行会将   Footer.inc   的内容插入到包含该行的文件中:  
   
<!--   #include   virtual   ="/myapp/footer.inc"   -->  
使用   File   关键字  
使用关键字“file”来表示相对路径。相对路径以包含文件所在的路径开始。例如,如果文件   Header1.inc   在   Myapp/Headers   中,并且   Myapp   中有一个文件,则下面的行会将   Header1.inc   插入到该文件中:  
   
<!--   #include   file   ="headers/header1.inc"   -->  
注意,被包含文件   Headers/header1.inc   的路径相对于包含文件;如果包含该“#include”语句的脚本不位于目录   /Myapp   中,语句将不起作用。  
   
也可以使用关键字“file”和语法   (../)   来包含父目录或更高层目录中的文件,但必须选中   Internet   信息服务管理单元中的“启用上层路径”选项。   有关说明,请参阅配置   ASP   应用程序。  
   
被包含文件的位置  
ASP   检测被包含文件的变化(不考虑位置),并当浏览器下一次请求包含该文件的   .asp   文件时插入该文件内容。不过,通常说来,如果包含文件驻留在相同应用程序或   Web   站点内部,则很容易维护这些文件的安全。若需要更高安全性,最好将包含文件放到应用程序内的单独目录中(如   /Includes),并且只应用适当的“执行”(Web   服务器)权限。详细信息,请参阅设置   Web   服务器权限。  
   
要点   默认情况下,对所有文件应用   Web   服务器“读取”权限。不过,要防止用户查看包含文件的内容,可以禁用   Include   目录的“读取”权限。  
   
包含文件:提示和警告  
被包含的文件也可以包含其他文件。只要“#include”命令不导致循环,.asp   文件也可以多次包含同一文件。例如,如果文件   First.asp   包含文件   Second.inc,则   Second.inc   不能反过来包含   First.asp。文件也不能包含其自身。ASP   检测这样的循环或嵌套错误,生成错误消息,并停止处理请求的   .asp   文件。  
   
ASP   在执行脚本命令之前包含文件。因此,不能使用脚本命令来建立被包含的文件名。举例来说,因为   ASP   试图在将文件名指派给变量   name   之前执行“#include”命令,所以下面的脚本无法打开文件   Header1.inc。  
   
<!-- 该脚本将失败   -->  
<%   name=(header1   &   ".inc")   %>  
<!--   #include   file="<%=   name   %>"   -->  
脚本命令和过程必须完全包含在脚本分隔符   <%   和   %>   内,即   HTML   标签   <SCRIPT>   和   </SCRIPT>,或   HTML   标签   <OBJECT>   和   </OBJECT>   内部。也就是说,不能在包含   .asp   文件中打开脚本分隔符,并在被包含的文件中关闭分隔符;脚本或脚本命令必须是一个完整的单元。例如,下面的脚本将不起作用:  
   
<!-- 该脚本将失败   -->  
<%  
For   i   =   1   To   n  
主文件中的语句  
<!-- #include   file="header1.inc"   -->  
Next  
%>  
但下面的脚本会起作用:  
   
<%  
For   i   =   1   to   n  
主文件中的语句  
%>  
<!-- #include   file="header1.inc"   -->  
<%   Next   %>  
注意   如果   ASP   脚本包含的文件中存在包含脚本不需要的大量函数和变量,则这些无用的结构反而会影响性能,并最终降低   Web   应用程序的伸缩性。因此,通常将包含文件分成多个小文件,并且只包含那些服务器端脚本必需的文件,而不是包含那些带有冗余信息的一个或多个大型包含文件。  
   
有时,可能需要使用   HTML   <SCRIPT></SCRIPT>   标签来包含服务器端文件。例如,下面的脚本包含服务器可以执行的文件(使用相对路径):  
   
<SCRIPT   LANGUAGE="VBScript"   RUNAT=SERVER   SRC="Utils/datasrt.inc"></SCRIPT>  
下表说明通过   SRC   属性使用虚拟或相对路径来包含文件的正确语法:  
   
路径类型   语法   示例:  
相对   SRC="Path/Filename"   SRC="Utilities/Test.asp"  
虚拟   SRC="/Path/Filename"   SRC="/MyScripts/Digital.asp"  
虚拟   SRC="/Path/Filename"   SRC="/RegApps/Process.asp"  

父路径会引起“HTTP 500 - 内部服务器错误”

  “HTTP 500 - 内部服务器错误”引起的原因有多个,初学者比较常见的就是没有启用让IIS支持父路径的功能。这也是我曾经遇到的问题,在windows2000 server下调试好的程序,到了windows2003 server下便出现“HTTP 500 - 内部服务器错误”,当时百思不得其解。这是由于“启用父路径”会带来安全问题,在windows2003上默认是不选的(见后文中引用的微软网站的文章)。

  启用父路径的操作步骤如下:
  1、启动IIS,在【默认网站】上右键单击,在弹出的菜单中选择【属性】,如图1所示;


图1

  2、单击【属性】菜单后,弹出如图2所示的对话框;


图2

  3、在图2中选择【主目录】属性页,然后单击【配置】按钮,弹出如图3所示的对话框;


图3

  3、在图3中选择【选项】属性页,然后选中图3中的“启用父路径”复选框。

  说明:
  “启动会话状态”,表示一个客户如果在设定期限内没有活动,则服务器会自动放弃保存客户端的信息以及其他相关的信息。默认的设置时间为20分钟。

  “启用缓冲”,此项必须选上,因为在ASP编程中,很多时候需要利用缓冲输出数据。

  “启用父路径”,ASP页面中如果使用到了include file=../header.asp 这样的代码,此项必须选上,../表示上级目录下的header.asp页面,是用相对路径来表示的,如果您的IIS页面设置中的“启用父路径”设置为False的情况下,访问此页面时就会报错,因为当前的IIS设置不允许使用..方式访问父路径,您需要将这个值设定为true。启用父路径指定 ASP 页面是否允许相对于当前目录的路径(使用 ../ 表示法)。如果设置为 true,则此属性可能会造成潜在的安全风险,因为包含路径可以访问应用程序根目录外的重要或机密的文件。如果出于安全考虑不开启父路径,建议路径指向的时候写绝对路径,即完整地址 如[url]http://www.xxx.com/header.asp[/url] 。


  “默认ASP语言”,表示在进行ASP编程的时候,默认的脚本语言VBScript或JavaScript,可以根据需要设置。也可以在程序中单独庙宇编程脚本。
  
附:微软网站:AspEnableParentPaths MetaBase 属性应设置为 False
  
症状
默认情况下启用活动服务器页 (ASP) 代码使用下列父目录批注:

<!-- #include file="../default.htm"-->
    
原因

MetaBase 中 AspEnableParentPaths 属性指定 ASP 可允许到当前目录相对路径 (我使用 / 表示法)。 这可能会带来安全风险。

增强安全性的环境, 中 AspEnableParentPaths 属性应设置为 False, 但 Internet Information Server 4.0 的默认安装将它设置为 True。

注意 : 禁用 ASP 父路径仅影响 .asp 网页上动态内容执行。 这不会影响服务器能力来引用静态内容使用 HTML 代码 (是否 .htm、 .html 或 .asp 文件中调用它)。 下行 default.asp 中会正确显示图像不返回 ASP 0131 错误, 即使 AspEnableParentPaths = False:
< = img src " 按钮 /images/logo.jpg " >
替代方法
要解决此问题, 执行以下步骤:
1. 在 Microsoft 管理控制台打开 Internet 服务管理器。  
2. 右击 Web 服务器问题。  
3. 在弹出菜单上选择属性。  
4. 单击主目录选项卡。  
5. 在应用程序设置框中选择配置。  
6. 单击 App 选项选项卡。  
7. 清除启用父路径选项。  
8. 单击确定两次以返回到 Microsoft 管理控制台。  

 

状态
Microsoft 已经确认这将 IIS 版本 4.0 和 5.0 中有问题
引用地址:[url]http://support.microsoft.com/kb/q184717/[/url]

解决方案:摘录下来的,,学习中....

使用SSI(Server   Side   Include)指令中的#Include  
   
asp包含文件的写法是这样的:  
   
在html中,写:  
   
<!--   #include   file   =   "FileName"   -->  
   
<!--   #include   Virtual   =   "FileName"   -->  
   
file和Virtual的区别在于file使用相对路径  
   
而Virtual是你的web站点内虚拟目录的完整虚拟路径  
   
比方:  
   
<!--   #include   file   =   "inc/char.inc"   -->  
   
就表示包含当前文件所在的虚拟目录路径下面的inc目录下的char.inc  
   
写成   virtual就可能就需要这么写了  
   
<!--   #include   virtual   =   "/myweb/inc/char.inc"   -->     

最简单的攻防方法:
在IIS中,有时要启用父路径,但黑客常常利用父路径访问硬盘文件。因此,我使用了一种方法: 先将IIS暂停,启用父路径。(之所以暂停是为了防止操作时遭攻击)然后,在根目录下创建虚拟路径“..”,任意选择一个原目录,并将它的所有权限取消即可。经测试,这样虽然可以用父路径,但若访问根目录的父路径,则会出现“您无权查看该网页”的错误。因为根目录下的父路径会被以为成虚拟路径“..”,而其他路径下则可以用父路径。 此方法在Windows Server 2003, Enterprise Edition, Service Pack 2的自带IIS中测试通过。 参见:

    
参考资料:
1、
http://technet.microsoft.com/zh-cn/library/cc785218(WS.10).aspx
     启用父路径
2、
http://chinesetoon.blog.51cto.com/326106/63318
     未启用父路径而导致的HTTP 500内部服务器错误
3、
http://doc.bsdlover.cn/html/php/2009/0531/39461.html
     在IIS中启用父路径,不被黑客利用