Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
apache需用mod_rewrite拦截请求非法字符、mod_substitute脱敏响应敏感内容,二者分别作用于进出环节,禁用不存在的“rewritefilter”模块。

Apache 本身不提供“一键过滤特殊字符”的黑盒功能,但可通过 mod_rewrite(请求层)和 mod_substitute(响应层)两套机制,分别在进、出两个关键环节精准拦截或替换有害字符,无需依赖不存在的 “RewriteFilter” 模块。
一、用 mod_rewrite 在请求入口拦截非法字符
这是最前置、最有效的防护——在请求抵达后端前就拒绝,避免解析、执行风险。
- 匹配原始编码后的 URI 和 QUERY_STRING:空格是
+或%20,中文是%E4%BD%A0,尖括号是%3C%3E,不能按明文写正则 - 禁止路径中出现:
../、.git/、WEB-INF/、%00(空字节)、//、反斜杠 - 拦截查询字符串中的 XSS/SQLi 特征:
%3Cscript、javascript%3A、select%20、union%20all、sleep%20?() - 规则示例(放入虚拟主机或
.htaccess):
RewriteCond %{REQUEST_URI} ../ [OR]<br>RewriteCond %{REQUEST_URI} (.git|WEB-INF|.env) [NC,OR]<br>RewriteCond %{REQUEST_URI} (%00|//|\) [NC]<br>RewriteCond %{QUERY_STRING} (%3Cscript|javascript%3A|select%20|union%20all) [NC]<br>RewriteRule ^ - [F]
二、用 mod_substitute 在响应体中脱敏敏感内容
适用于后端已返回含敏感信息(如手机号、身份证号、密码字段)的 HTML 或 JSON 响应,需动态替换再发给客户端。
- 先启用模块:
a2enmod substitute filter(Debian/Ubuntu),或手动加载mod_substitute.so和mod_filter.so - 挂载过滤器到对应 MIME 类型:
AddOutputFilterByType SUBSTITUTE text/html application/json - 替换规则用
s#...#...#g语法,避免斜杠冲突;JSON 中双引号、反斜杠需转义;[0-9]替代d - 示例(隐藏手机号后四位):
Substitute "s#"phone":"[0-9]{7}([0-9]{4})"#"phone":"****$1"#g"
三、配合环境变量记录拦截行为,便于审计
光返回 403 不够,得知道谁、什么时候、因什么被拦。
- 用
SetEnvIf标记命中规则的请求:SetEnvIf Request_URI "(.git|WEB-INF)" blocked=1 - 在自定义日志格式中加入该变量:
%{blocked}e,或直接写入独立安全日志 - 结合
%{QUERY_STRING}和%{REQUEST_URI}记录原始请求片段,不依赖解码,避免歧义
四、避开常见陷阱
很多问题不是规则写错,而是理解偏差导致失效。
-
RewriteRule默认不处理?后的内容——必须用RewriteCond %{QUERY_STRING}单独检查 -
NE标志只影响RewriteRule的输出编码,与过滤无关;误加可能让恶意参数绕过解码校验 - 不要对不可信输入直接用
NE+R重定向——保留原始=或;可能引发 URL 解析歧义 -
.htaccess生效前提:目录配置中AllowOverride FileInfo已开启,且RewriteEngine On在文件开头









