【问题标题】:Strip down any parameter from URL which is not whitelisted从 URL 中删除任何未列入白名单的参数
【发布时间】:2013-11-04 19:25:45
【问题描述】:

我需要去除不在白名单中的 any 参数,例如网址:

abc.com/somePage?phone=1234&stipAway=asd&fax=324&stripDown=disappear&zip=zip

应该看:

abc.com/somePage?phone=1234&fax=324&zip=zip

相关问题:Rewrite URL using .htaccess file in case there is used parameters which is not in white list

附:在提到的前两个答案中需要更复杂的解决方案。为了便于理解,我将用更多示例进行说明:

abc.com/somePage2?stripAway=asd&fax=324&stripDown=disappear&phone=1234&zip=zip

应该看:

abc.com/somePage2?fax=324&phone=1234&zip=zip

abc.com/somePage3?stripAway=asd&stripDown=disappear

应该看:

abc.com/somePage3

【问题讨论】:

  • 如果不是所有参数都存在,我已经用一种方法编辑了我的答案。不过,我建议在页面本身上执行此操作。
  • @Martins:抱歉我昨天没能解决这个问题。我相信也会有一些纯粹的 .htaccess 方式来做这件事。我今天会试试看。

标签: regex apache .htaccess url mod-rewrite


【解决方案1】:

如果列表是有序的,anubhava 的答案比我的要好得多。如果不能保证列表是有序的,您可以使用以下规则。它使用Jon Lin uses in this answer的技术。

RewriteCond %{QUERY_STRING}           ^(.*&|)(?!(phone|fax|zip))[^=]+=
RewriteCond ##%{QUERY_STRING}         (.*?)##(|.*&)(phone)=([^&]+)
RewriteCond %1&%3=%4##%{QUERY_STRING} (.*?)##(|.*&)(fax)=([^&]+)
RewriteCond %1&%3=%4##%{QUERY_STRING} (.*?)##(|.*&)(zip)=([^&]+)
RewriteRule ^(.*)$ $1?%3=%4%1 [R,L]

那么,它有什么作用?第一个条件只有在找到与(phone|fax|zip) 不匹配的参数时才为真(负前瞻)。接下来的三个RewriteCond 捕获您要保留的每个参数,并在自定义## 分隔符之前准备一个查询字符串。如果该分隔符恰好在您的查询字符串中,将会发生奇怪的事情。

这种方法的缺点是,如果这三个参数之一不存在,则不会应用该规则。我个人会将此白名单放在页面本身中,而不是尝试通过 .htaccess 对其进行过滤。


编辑:如果某些参数是可选的,您可以使用以下怪物:

RewriteCond %{QUERY_STRING} ^((.*?)&|)(?!(phone|fax|zip))[^=]+=[^&]+(&.*|)$
RewriteRule ^(.*)$ $1?%2%4 [R,E=Redir:1]

RewriteCond %{QUERY_STRING} ^&(.*)$
RewriteRule ^(.*)$ $1?%1 [R,E=Redir:1]

RewriteCond %{ENV:Redir} =1
RewriteRule ^ - [R,L]

基本上,如果字符串中有参数与前瞻中的参数不匹配,它将匹配该参数之前的部分和该参数之后的部分并重新生成查询字符串。第二条规则是如果第一个参数没有被“列入白名单”(或者它只是简单地以 & 开头),则防止它吞噬整个查询字符串,最后一条规则是尝试将重定向的数量保持在最低限度。请注意,如果请求中未列入白名单的参数过多,浏览器会显示错误(检测到重定向链)。


相反,我建议对页面本身进行过滤。在 php 中,它将类似于以下代码。如果您决定使用其他 httpdeamon,这将使维护此白名单变得更容易,并且不会破坏一切。

<?php
$whitelist = Array( 'phone', 'fax', 'zip' );
foreach( $_GET as $k => $v ) {
  if( !in_array( $k, $whitelist ) )
    unset( $_GET[$k] );
}

#And the same for $_POST and $_REQUEST

【讨论】:

  • 感谢@Sumurai8 的解释。我将在应用程序中使用处理它的方法。
【解决方案2】:

以下内容应该适合您:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^(?:.*?&)?(phone=[^&]*)(?:.*?&)(fax=[^&]*)(?:.*?&)(zip=[^&]*) [NC]
RewriteRule ^ %{REQUEST_URI}?%1%2%3 [L,R=302]

PS:这是假设白名单参数按上述顺序出现,即电话、传真、邮编

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2014-10-25
    • 1970-01-01
    相关资源
    最近更新 更多