web安全之--UrlRewrite

最近在做一个项目,在做项目的过程中发现,由于自己的命名规范,显示在url地址栏中的信息如果不加修饰,很容易被人理解并且改写。如果让别人看不懂自己网站上的url地址栏的内容是不是非常好呢,于是自己便发时间去查找资料研究了一下,最后发现UrlRewrite很趁自己的心意。经过学习发现UrlRewrite有很多优点,第一,提高安全性,可以避免参数和id等完全暴露在用户面前。第二,美化URL。第三:由于网络爬虫特别喜欢静态网页,所以更有利于搜索引擎收入。

好讲到这里,我们来实现第一个小demo吧。

首先建立一个web项目,然后在web.xml里面加上这样一段代码,也就是配置过滤器(建议此过滤器放在所有servlet和过滤器的上面)

<!-- urlrewrite过滤器-->
<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>
然后在web.xml的同级目录加一个urlrewrite.xml,因为默认是在这个目录找这个xml的,代码如下

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite
PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
"http://tuckey.org/res/dtds/urlrewrite4.0.dtd">
<urlrewrite>
    <rule>
    <!-- <from>中的地址表示我们浏览器要访问的地址 -->
        <from>^/news/news.html$</from>
     <!-- <to>中的内容表示浏览器访问了上述地址后,实际转向能真正访问系统的地址 -->
        <to>/news/news.jsp</to>
    </rule>
    
    <rule>
        <from>^/news/([0-9]+).html$</from>
        <to>/news/news.jsp?newsId=$1</to>
    </rule>
    
    <outbound-rule>
        <from>^/WebTest/news/news.jsp\?newsId=([0-9]+)$</from>
        <to>/WebTest/news/$1.html</to>
    </outbound-rule>
</urlrewrite>
然后是index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首页</title>
</head>
<body>
    <ul>
        <li>新闻</li>
        <ul>
            <li><a href="${pageContext.request.contextPath}/news/news.html?newsId=news">新闻</a></li>
            <li><c:url value="/news/news.jsp?newsId=1" var="tempNewsUrl"></c:url>
                <a href="${tempNewsUrl}">新闻1</a></li>
            <li><c:url value="/news/news.jsp?newsId=2" var="tempNewsUrl"></c:url>
                <a href="${tempNewsUrl}">新闻2</a></li>
            <li><c:url value="/news/news.jsp?newsId=3" var="tempNewsUrl"></c:url>
                <a href="${tempNewsUrl}">新闻3</a></li>
        </ul>
    </ul>
</body>
</html>
 然后是news.jsp 这个jsp放在webContent的news文件夹下
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%Object newsId=request.getParameter("newsId"); %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>新闻</title>
</head>
<body>
本条新闻id为 :<%="news".equals(newsId.toString())?"空值,因为您访问的是静态页面news.html":newsId %>
</body>
</html>
这样写完后运行一下,将鼠标移到链接出就会出 现这样的提示,说明已经成功了

点击后的url地址栏



解释原因

上面整个过程中,实现伪静态起关键作用的就是urlrewrite.xml的配置。

  先看<rule>标签中的配置:

  <from>中的地址表示我们浏览器要访问的地址(即敲回车前在地址栏输入的地址,或者<a>标签指向的连接),可以自己指定。<from>中的地址内,括号里的内容为正则表达式,用来过滤字符,比如 ^/news/([0-9]+).html$ 表示可以匹配/news目录下以任意位数字命名的.html文件,如news/1.html、news/1234.html等。主要用于过滤访问路径或传参。

  <to>中的内容表示浏览器访问了上述地址后,实际转向能真正访问系统的地址,这个地址需要是真是存在的(当然SpringMVC可以设置为Controller的地址,struts2可以设置为action的地址等),上面例子<to>标签指向的地址中的“$1”表示<from>标签中的第一处正则表达式所匹配的实际内容,利用这一特性,可以达到传参的效果。


<rule>标签所起到的作用就是:浏览器访问的是<from>中的地址,它把这个地址经过过滤转向访问<to>中地址,返回时再以静态地址的方式显示。

  但一般情况下,这些静态地址都不是我们手动输入到地址栏的,而是存在于网页中,由用户点击访问的,而且很多情况下<a>标签中的地址都会用动态地址如.jsp、.php等,这种情况下,就需要使用<outbound-rule>了。滑动一下鼠标再上去看一下<outbound-rule>的配置会发现,其中的<from><to>标签中的内容差不多与<rule>标签刚好相反。

  文章上面对”新闻1”链接的配置就是如此,<c:ur>中的地址本来是动态地址,经过与jstl的<c:ur>标签结合使用,给用户展现的就是一个静态地址了,相当于比直接访问静态页面多走了两步,urlrewrite.xml中具体执行顺序如下

这里写图片描述

${tempNewsUrl}中的链接指向<outbound-rule>标签<from>中的地址,继而通过各种转向,最终执行到真正的动态地址。

  温馨提示:一些特殊字符在<outbound-rule>中需要转义哦!比如“?”需要转义成“\?”,“&”需要转义成“&amp ;”……

最后要使用这个功能,别忘了到jar包到lib文件夹下哟

下载链接:http://pan.baidu.com/s/1csuZYu



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值