DWR高级主题之DWR安全机制
----------
很多其他Ajax工具对安全性考虑不够,让你直面安全威胁。DWR提供一些安全机制,你也许会发现它非常适合自己的需求。DWR使用多层安全保障方法,但是,至少有一个机制必须始终启用。
1.默认拒绝
无须做任何设置,DWR会自动采用"默认拒绝"方法。这意味着,在默认情况下,DWR不允许任何类被远程访问。回想一下希望远程访问的每个类,必须在配置文件中添加<create>元素。这个<create>元素还应该被嵌套在<allow>元素中。通过添加这种信息条目,可以告诉DWR,指定类的远程调用被授权了。但是,如果没有在这个配置文件中添加相应的信息条目,则远程调用会被禁止。
2.J2EE安全性和DWR
如果执著地希望进一步加强web应用程序的安全性,可以采取其他措施把J2EE安全性和DWR集成到一起。借助于这种能力,可以指定只有特定的安全角色才能访问特定的远程类,或者特定角色可以访问某远程对象的特定方法。
2.1 保护DWRServlet
第一个需要注意的事情是,使用基于J2EE角色的安全机制,保证DWRServlet自身的安全性。为实现这一点,我们必须引入其他配置选项:多个dwr.xml文件。默认情况下,DWR会在web应用程序的WEB-INF目录中查找一个名为dwr.xml的文件,所以不必再实施任何其他修改。但是,如果希望在其他地方放置这个配置文件,需要向servlet添加一个init参数,类似于:
另一个方便的技巧是,你可以指定多个配置文件。为实现这一点,只需要添加多个init参数,参数名称的格式为configXXXX,其中XXXX可以是任何内容。每个init参数的名称必须是不同的,使用XXXX的目的仅仅是保证唯一性。例如:
如何把这些集成到安全性方面呢?你还需要做的事情是定义DWRServlet的多个实例,如例:
2.2 保护单独的方法
还可以保护指定的远程可访问类中单独的方法。只需要在web.xml文件以及DWR配置文件中定义相应的角色,同时在DWR配置文件中需要给希望保护的类的<create>元素添加一个<auth>元素。下面是范例代码:
----------
很多其他Ajax工具对安全性考虑不够,让你直面安全威胁。DWR提供一些安全机制,你也许会发现它非常适合自己的需求。DWR使用多层安全保障方法,但是,至少有一个机制必须始终启用。
1.默认拒绝
无须做任何设置,DWR会自动采用"默认拒绝"方法。这意味着,在默认情况下,DWR不允许任何类被远程访问。回想一下希望远程访问的每个类,必须在配置文件中添加<create>元素。这个<create>元素还应该被嵌套在<allow>元素中。通过添加这种信息条目,可以告诉DWR,指定类的远程调用被授权了。但是,如果没有在这个配置文件中添加相应的信息条目,则远程调用会被禁止。
读者肯定会认识到,这种措施实际上还存在一个潜在的安全漏洞:在默认情况下,被授权类的所有方法都可以通过远程调用来访问。在通常情况下,这样做就可以了,因为我们平常的代码组织习惯是一个类始终包含可以远程调用的所有"安全"方法。其实,我们也可以这样设计,类中部分方法可以安全地远程调用,部分方法不允许远程调用。如例,我们不希望远程调用divide()方法。我们可以简单地添加一个<exclude>元素。现在,存在一个<exclude>元素和一个<create>元素的子元素<include>元素。这两个元素是互斥的,也就是说,可以使用<include>元素来指定能够远程调用的方法列表(没有列出来的方法都是不可以远程调用的),或者使用<exclude>元素来指定不允许远程调用的方法列表(没有列出来的任何方法都是可以访问的)。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">
<dwr>
<allow>
<create creator="new" javascript="MathDelegate">
<param name="class" value="app.MathDelegate"/>
<exclude method="divide"/>
</create>
</allow>
</dwr><include>和<exclude>元素都接收一个以逗号分隔的列表作为method的属性值,这样可以按照自己的需求指定任意多个方法。请注意,DWR从来不允许自己的内部类被远程访问,因此可以降低攻击者破坏DWR内部机制的概率,进一步增强应用程序的安全性。2.J2EE安全性和DWR
如果执著地希望进一步加强web应用程序的安全性,可以采取其他措施把J2EE安全性和DWR集成到一起。借助于这种能力,可以指定只有特定的安全角色才能访问特定的远程类,或者特定角色可以访问某远程对象的特定方法。
2.1 保护DWRServlet
第一个需要注意的事情是,使用基于J2EE角色的安全机制,保证DWRServlet自身的安全性。为实现这一点,我们必须引入其他配置选项:多个dwr.xml文件。默认情况下,DWR会在web应用程序的WEB-INF目录中查找一个名为dwr.xml的文件,所以不必再实施任何其他修改。但是,如果希望在其他地方放置这个配置文件,需要向servlet添加一个init参数,类似于:
<init-param>
<param-name>config</param-name>
<param-value>configFiles/dwrConfig.xml</param-value>
</init-param>现在,DWR会加载configFiles目录(相对于web应用程序的根目录)中的文件dwrConfig.xml。另一个方便的技巧是,你可以指定多个配置文件。为实现这一点,只需要添加多个init参数,参数名称的格式为configXXXX,其中XXXX可以是任何内容。每个init参数的名称必须是不同的,使用XXXX的目的仅仅是保证唯一性。例如:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config1234</param-name>
<param-value>configFiles/dwrConfig1234.xml</param-value>
</init-param>
<init-param>
<param-name>config5678</param-name>
<param-value>configFiles/dwrConfig5678.xml</param-value>
</init-param>
</servlet>DWR会加载所有的配置文件,并把这些配置文件合并为一个主配置(不需要自己做任何其他配置!)如何把这些集成到安全性方面呢?你还需要做的事情是定义DWRServlet的多个实例,如例:
<servlet>
<servlet-name>dwr-user-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-user</param-name>
<param-value>WEB-INF/dwr-user.xml</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>dwr-admin-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-admin</param-name>
<param-value>WEB-INF/dwr-admin.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-admin-invoker</servlet-name>
<url-pattern>/dwradmin/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-user-invoker</servlet-name>
<url-pattern>/dwruser/*</url-pattern>
</servlet-mapping>目前实际上存在两类用户:一般用户与管理用户。每类用户拥有不同的配置文件,而且更重要的是,每类用户使有不同的URL映射。这样做很重要,原因是可以充分利用J2EE安全机制,以根据角色来保护sevlet。例如:<security-constraint>
<web-resource-collection>
<web-resource-name>dwr-admin-collection</web-resource-name>
<url-pattern>/dwradmin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>dwr-user-collection</web-resource-name>
<url-pattern>/dwruser/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>现在,只有管理用户才能访问dwr-admin.xml文件所定义的类,并且通过/dwradmin/* URL模式进行访问。类似地,一般用户只能够访问dwr-user.xml文件中所定义的类,并且通过/dwruser/* URL模式进行访问。这样,借助于标准的容器管理安全机制,可以有效地保护允许远程访问的对象。2.2 保护单独的方法
还可以保护指定的远程可访问类中单独的方法。只需要在web.xml文件以及DWR配置文件中定义相应的角色,同时在DWR配置文件中需要给希望保护的类的<create>元素添加一个<auth>元素。下面是范例代码:
<create creator="new" javascript="RemotableClass">
<param name="class" value="com.myapp.RemotableClass"/>
<auth method="delete" role="admin"/>
</create>现在,我们声明RemotableClass类的delete()方法只能被管理用户所调用。请注意,所有其他方法都不会被相应地保护,因为这是DWR的默认行为。借助于这种细微的控制能力,可以更灵活地应用容器管理安全性,以及设计希望远程访问的类。
本文介绍了DWR框架中关于安全机制的主题,指出默认情况下所有授权类的方法都可远程调用,这可能存在安全隐患。为了增强安全性,可以使用<exclude>或<include>元素来指定允许或禁止远程调用的方法,确保敏感操作如divide()不被远程访问。

5679

被折叠的 条评论
为什么被折叠?



