** Предупреждение: подход, описанный в этом ответе, применим только к очень конкретным сценариям и не является безопасным, поскольку атаки 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, история , браузера или любой другой конфиденциальной информации, поэтому вы можете иметь дело с ними позже, запретив их учетную запись или контактные органы.
нормальное функционирование 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]
Я не уверен, что понимаю то, что Вы спрашиваете, но 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).
, По крайней мере, я думаю, что это - то, как это работает... Я никогда не использовал тот конкретный флаг сам.