.htaccess实际运用案例之过滤URL特殊字符,防止XSS攻击

一、XSS漏洞发现
    https://localhost/deals//'onmouseover%3d'prompt%28960807%29'bad%3d' XSS: 发送该URL请求会返回一个alert()弹框
    打印接收到的参数、变量
    Array
(
    [ctl] => deals
    [act] =>
    ['onmouseover='prompt(960807)'bad='] =>
)

https://localhost/deals
Array
(
    [ctl] => deals
    [act] =>
)

https://localhost/deals/cid-28
Array
(
    [ctl] => deals
    [act] =>
    [cid] => 28
)


二、XSS解决方案:
1.在apache 中开启重写,将注释去除
#LoadModule rewrite_module modules/mod_rewrite.so
LoadModule rewrite_module modules/mod_rewrite.so

2.找到项目目录权限配置AllowOverride None 为All
<Directory "/xampp/htdocs">
...
    AllowOverride All
...
</Directory>
3.然后修改项目根目录下的.access文件
<IfModule mod_rewrite.c>
RewriteEngine On
...

RewriteCond %{QUERY_STRING} [\"\'\<\>]+ [NC]
RewriteRule ^.* [F,L]
</IfModule>
4.重启apache,测试xss无效,说明成功



.htaccess相关说明
<IfModule mod_rewrite.c>
#如果mode_rewrite.c模块存在 则执行以下指令

RewriteEngine On
#开启rewriteEngine

RewriteCond %{QUERY_STRING} [\"\'\<] [OR]
#RewriteCond TestString CondPattern [flags]
    RewriteCond指令定义了一个规则的条件,即,在一个RewriteRule指令之前有一个或多个RewriteCond指令。 条件之后的重写规则仅在当前URI与pattern匹配并且符合这些条件的时候才会起作用。RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能
    TestString是一个纯文本的字符串,但是还可以包含下列可扩展的成分:
        RewriteRule反向引用: 引用方法是 $N  (0 <= N <= 9) 引用当前(带有若干RewriteCond指令的)RewriteRule中的 与pattern匹配的分组成分(圆括号!)。
        RewriteCond反向引用: 引用方法是 %N  (1 <= N <= 9) 引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。
        RewriteMap 扩展: 引用方法是 ${mapname:key|default}
        服务器变量: 引用方法是 %{ NAME_OF_VARIABLE }  这个是我们最常使用到的功能
            NAME_OF_VARIABLE具体数值见下表:
            HTTP headers:
            connection & request:
            HTTP_USERAGENT
            HTTP_REFERER
            QUERY_STRING
    CondPattern是条件pattern, 即, 一个应用于当前实例TestString的正则表达式, 即, TestString将会被计算然后与CondPattern匹配.
    注意:CondPattern是一个兼容perl的正则表达式, 但是还有若干补充:

    Flags标识是是第三个参数,可以用来紧跟下一个条件,这儿用OR表示或者,如果没有[Flags],则用隐含的AND,表示并且。其它的还可以NC等等,表示忽略大小写

RewriteRule ^index\.php$ – [L]
#重写规则
#^index\.php$是匹配正则表达式,只匹配了index.php
    
RewriteRule . /index.php [L]
#同样是重写规则,代表任意字符,替代为/index.php

#RewriteRule Pattern Substitution [Flags]
    Pattern就是参数,一般为一些文件的扩展名,
    Substitution是用来替换前面用的,
    Flags:
        常用的R表示 redirect(强制重定向),
        F表示forbidden(禁止访问),
        L表示last(最后),通常当你希望停止重写操作而立即重定向时,可用它。



.htaccess中的[NC][R][F][L]几个标记是什么意思
NC: no case,就是说不区分大小写    [NC](no case):表示忽略大小写
R:redirect,重定向    [R](redirect):触发一个显示的跳转,也可以指定跳转类型,如[R=301]
F:forbidden,禁止访问    [F](forbidden):禁止查看特定文件,apache会触发403错误
L:last,表示已经是最后一条规则,.htaccess文件解析即将退出   [L](last):终止一系列的RewriteCond和RewriteRule   这个标记可以阻止当前已被重写的URL为其后继的规则所重写。
qsappend|QSA”(追加查询字符串)  此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。


其它相关介绍
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#上面两个均为重写条件,%{}中内容为apache定义的一系列返回参数
#RewriteCond指令定义了一个规则的条件,即,在一个RewriteRule指令之前有一个或多个RewriteCond指令。
条件之后的重写规则仅在当前URI与pattern匹配并且符合这些条件的时候才会起作用。

你可能感兴趣的:(.htaccess)