2015-06-17 6 views
1

У меня есть PHP-скрипт, используемый для обработки изображений перед их отображением на веб-странице. Строку запроса нужно проверить, чтобы отклонить все запросы, поступающие из внешних доменов. Если ДВА example.com
Фильтрация QUERY_STRING с обратными ссылками в RewriteCond

http://example.com/process.php?img=somepath/images/imgX.png OK 
http://example.com/process.php?img=http://example.com/anotherpath/folder/images/imgX.png OK 
http://example.com/process.php?img=http://anotherdomain.com/images/someimg.jpg Rejected! 

Это переписывает правила работы на моем тестовом сервере:

<IfModule mod_rewrite.c> 
RewriteEngine on 
RewriteCond %{REQUEST_METHOD} GET 
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// 
RewriteCond expr "! %{QUERY_STRING} -strmatch '*%{HTTP_HOST}*'" 
RewriteRule .* - [F] 
</IfModule> 

Но на сервере это не работает. После некоторых головных болей и поиска я обнаружил, что expr не поддерживается до Apache 2.4 ...
Из того, что я прочитал, я могу использовать атомные обратные ссылки, чтобы проверить, присутствует ли% {HTTP_HOST} в% {QUERY_STRING}. Идея состоит в том, чтобы построить что-то вроде этого

RewriteCond %{HTTP_HOST}::%{QUERY_STRING} ^(.*?)::/\1/? 

Который явно не работает в текущем состоянии. Любая помощь и дальнейшее объяснение этого синтаксиса будут с благодарностью оценены.

+0

Как 'RewriteCond% {QUERY_STRING} [a-zA-Z0-9_] = http: //' allow '? Img = somepath/images/imgX.png' строка запроса? – anubhava

+0

В этом суть, это не позволяет. Поскольку условие не выполняется, остальные игнорируются, RewriteRule Forbidden не применяется и запрос обрабатывается нормально. – JeffT

ответ

1

Вы можете использовать это правило в Apache 2.2:

RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// 
RewriteCond %{HTTP_HOST}#%{QUERY_STRING} !^([^#]+)#.*?\1 
RewriteRule^- [F] 

\1 является обратной ссылкой на HTTP_HOST

модифицировали RewriteCond к

RewriteCond %{HTTP_HOST}#.*#%{QUERY_STRING} !^([^#]+)#.*?\1 

Это захватывает любой Структура URL. JF

+0

Спасибо anubhava Я только что пробовал ваше решение, но оно не работает. (фильтрация не выполняется). – JeffT

+0

Я протестировал его со всеми 3 случаями и работает, как ожидалось, на моем Apache. – anubhava

+0

Должно быть, сегодня не повезло;) Протестировано на 2 серверах (Apache 2.2 и 2.4) пока не работает. Правило не отклоняет строки запроса, содержащие внешний домен. У меня нет другого правила в моем файле .htaccess – JeffT

1

Если вы хотите сделать это на площадке PHP, вы можете использовать parse_url.

Link to PHP documentation.

+0

Я, очевидно, уже реализовал это в php-файле, но хочу иметь дополнительный уровень безопасности на уровне сервера. – JeffT