
nginx
요청 URI 내의 일부 잘못된 요청을 일치시키고 차단하기 위해 구성 에서 다음 if 문 정규식을 사용하고 있습니다 . 이러한 잘못된 쿼리는 항상 하나의 인수만 요청하지만 매번 임의의 이름(및 영숫자 개수)을 사용합니다. 그들은 또한 항상 홈페이지를 방문했습니다.
잘못된 쿼리의 예:
/?some1bad0query2=nminkvywbjfdysnvhp
if ($request_uri ~ "[\w]{5,25}\=[\w]{5,25}$") {
return 403;
}
key
또는 query
(예: /?query=somestring) 과 같은 일부 인수 이름과 일치하는 것을 제외하도록 이 정규식을 수정하려면 어떻게 해야 합니까 ?
나는 둥근 괄호를 사용하려고 시도했지만 ?(!query)
운이 없었습니다.
이 정규식 문을 수정하도록 도와주세요. 미리 감사드립니다.
답변1
이를 수행하는 방법에는 두 가지가 있습니다. 사용부정적 예측 주장또는map
.
예를 들어:
if ($request_uri ~ "(?!query)\w{5,25}=\w{5,25}$") { return 403; }
의 장점은 map
일치하는 항목이 발견될 때까지 정규식을 순서대로 평가하므로 복잡한 예측식을 피할 수 있다는 것입니다.
예를 들어:
map $request_uri $reject {
~*^/\?query= 0;
"~*^/\?\w{5,25}=\w{5,25}$" 1;
}
server {
...
if ($reject) { return 403; }
...
}
블록 은 블록 map
외부에 있습니다 server
. 규칙이 로 시작하는 URI에만 적용되는 경우 /?
이를 정규식에 추가해야 합니다(두 번째 예 참조).