Как закодировать специальные символы с помощью mod_rewrite и Apache?

** Предупреждение: подход, описанный в этом ответе, применим только к очень конкретным сценариям и не является безопасным, поскольку атаки SQL-инъекции не только полагаются на возможность вставлять X=Y. **

Если злоумышленники пытаются взломать форму с помощью переменной PHP $_GET или с помощью строки запроса URL, вы сможете поймать их, если они не защищены.

RewriteCond %{QUERY_STRING} ([0-9]+)=([0-9]+)
RewriteRule ^(.*) ^/track.php

Поскольку 1=1, 2=2, 1=2, 2=1, 1+1=2 и т. д. ... являются распространенными вопросами к базе данных SQL злоумышленника. Возможно, он также используется многими хакерскими приложениями.

Но вы должны быть осторожны, чтобы не переписывать безопасный запрос с вашего сайта. Вышеупомянутый код дает вам возможность переписать или перенаправить (зависит от вас) эту динамическую строку запроса, зависящую от хакерства, на страницу, в которой будет храниться IP-адрес злоумышленника или EVEN THEIR COOKIES, история , браузера или любой другой конфиденциальной информации, поэтому вы можете иметь дело с ними позже, запретив их учетную запись или контактные органы.

28
задан MrWhite 6 January 2013 в 22:50
поделиться

2 ответа

нормальное функционирование apache/mod_rewrite не работает как это, поскольку это, кажется, превращает знаки "плюс" в пробелы.

я не думаю, что это вполне, что происходит. Apache декодирует %2Bs к +s в части пути, так как + допустимый символ там. Это делает это прежде, чем позволить mod_rewrite посмотреть на запрос.

Таким образом mod_rewrite изменяет Ваш запрос '/tag/c ++' к 'script.php? tag=c ++ '. Но в компоненте строки запроса в формате application/x-www-form-encoded, правила выхода очень немного отличаются тем, которые применяются в частях пути. В частности,' +' стенография для пространства (который мог точно также быть закодирован как '%20', но это - старое поведение, которое мы никогда не будем в состоянии изменить теперь).

, Таким образом, читающий форму код PHP получает 'C++' и выводит его в Вашем _GET как C-space-space.

Похож на путь вокруг этого, должен использовать rewriteflag 'B'. См. http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteflags - любопытно это использует более или менее тот же пример!

RewriteRule ^tag/(.*)$ /script.php?tag=$1 [B]
26
ответ дан bobince 28 November 2019 в 03:41
поделиться

Я не уверен, что понимаю то, что Вы спрашиваете, но NE (noescape) флаг к Apache RewriteRule, директива могла бы иметь некоторый интерес Вам. В основном это предотвращает mod_rewrite от автоматического выхода из специальных символов в шаблоне замены, который Вы обеспечиваете. Пример, данный в документации Apache 2.2,

RewriteRule /foo/(.*) /bar/arg=P1\%3d$1 [R,NE]

, который повернется, например, /foo/zed в перенаправление к /bar/arg=P1%3dzed, так, чтобы сценарий /bar тогда видел параметр запроса, названный arg со значением P1=zed, если это посмотрит в PATH_INFO (хорошо, это не реально параметр запроса, поэтому предъявите иск мне;-P).

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

5
ответ дан David Z 28 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: