2013-11-04 2 views
2

매개 변수는 흰색 목록에 없습니다. URL :허용 목록에없는 URL의 매개 변수를 잘라내십시오.

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

P.S. 처음 두 답변에서 언급 한 것보다 더 복잡한 솔루션이 필요합니다. 이해하려면 좀 더 많은 예제와 함께 설명합니다 :

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 
+0

모든 매개 변수가없는 경우 방법으로 내 대답을 편집했습니다. 그래도 페이지 자체에서이 작업을 수행하는 것이 좋습니다. – Sumurai8

+0

@Martins : 어제이 문제에 참석할 수 없어 죄송합니다. 나는 이것을하기의 순수한 .htaccess 방법이 또한있을 것이라는 점을 확실하다. 나는 오늘 그것을 시험 할 것이다. – anubhava

답변

0

를 압축, 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) (음수 앞 어서)과 일치하지 않는 매개 변수를 찾을 수있는 경우에만 true입니다. 다음 세 개의 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 
+0

설명해 주셔서 감사합니다 @ Sumurai8. 응용 프로그램에서 처리하는 방법을 사용하겠습니다. – Martins

0

을 위해 다음과 같은 작업을해야 너 :

RewriteEngine On 

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

PS : 목록 순서에있는 경우이 화이트리스트 PARAMS 즉 위의 순서로 나타납니다 가정 한 것입니다 전화, 팩스,

관련 문제