Apache mod_rewrite заменяет символы в REQUEST_URI - PullRequest
1 голос
/ 26 апреля 2010

Я пытаюсь написать некоторые правила .htaccess, которые заменяют определенные символы в параметре REQUEST_URI. В частности, я хочу заменить следующее:

  • "<" = <code>&lt;
  • ">" = &gt;
  • "'" = &apos;
  • '"' = &#x22;
  • ")" = &#x29;
  • "(" = &#x28;

Пример URL может быть http://www.example.com/?<script>alert(1)</script>&q=")("<script')

Я перепробовал целую кучу методов, но безуспешно. Может ли кто-нибудь указать мне правильное направление? Спасибо.

1 Ответ

1 голос
/ 02 мая 2010

Вы можете использовать mod_rewrite для выполнения этой замены, см. Этот пример для <:

RewriteCond %{QUERY_STRING} ^([^<]*)<([^<]*)<(.*)
RewriteRule ^ %{REQUEST_URI}?%1&lt;%2&lt; [N]
RewriteCond %{QUERY_STRING} ^([^<]*)<([^<]*)$
RewriteRule ^ %{REQUEST_URI}?%1&lt;%2 [L]

Первое правило заменит два < символа за раз, а второе завершит рекурсию. Другие символы можно заменить таким же образом (просто замените < и &lt; другими парами).

Но использование mod_rewrite для такой работы не очень подходит, потому что

  1. mod_rewrite позволяет заменять только фиксированное количество вхождений за раз и
  2. количество замен ограничено внутренним счетчиком перенаправления, который используется, чтобы избежать бесконечной рекурсии.

Хотя второе утверждение в этом случае не применяется из-за использования флага N , , я бы не рекомендовал использовать mod_rewrite для такого рода работы .

Я бы порекомендовал сделать это в веб-приложении, возможно, непосредственно перед тем, как поместить свои данные в документ HTML, а не профилактически для каждого ввода независимо от того, как эти данные обрабатываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...