2016-08-20 3 views
1

Я хотел бы проверить, вошли ли пользователи для доступа к файлам изображений. Изображения будут иметь такую ​​формуЗащитить изображения через .htaccess и PHP

https://domain.com/folders/imagename.jpg 

Я попробовал это в .htaccess:

RewriteEngine On 
RewriteCond %{REQUEST_URI}\.jpg 
RewriteRule ^(.*)\.jpg$ /protect.php 

И это в моем файле protect.php

<?php 
if(rcp_is_active()){ 
    header('Content-Type: image/jpg'); 
    readfile($imageurl); 
} 
else{ 
    readfile("https://placeholdit.imgix.net/~text?txtsize=38&txt=Forbidden&w=400&h=400") 
} 
?> 

Мой вопрос:

  • Как мне заполнить файл .htaccess, чтобы передать файл filename.jpg в файл php?
+1

Вы не должны обновлять вопрос, чтобы содержать решение. – MrTux

ответ

1

Обновить ваш .htaccess RewriteRule передать совпадающее имя файла в PHP скрипт следующим образом (ваш RewriteCondition излишен):

RewriteEngine On 
RewriteRule ^((.*)\.jpg)$ /protect.php/$1 

Затем вы можете получить доступ к значению проходит с использованием $_SERVER['PATH_INFO'] или $_SERVER['PATH_TRANSLATED'] (то Apache пытается сопоставить его с реальным путем в соответствии с корнем документа, см. mod_cgi и RFC 3875 для получения дополнительной информации). Для этого необходимо активировать AcceptPathInfo в Apache httpd (по умолчанию).

или использовать

RewriteRule ^((.*)\.jpg)$ /protect.php?filename=$1 

и использовать $_GET['filename']. Особенно здесь, остерегайтесь атак на обход каталога (например, кто-то использует /protect.php?filename=../../someother-file.jpg). Обычно я использую realpath, чтобы нормализовать путь и проверить, что он начинается с папки, содержащей файлы или корень документа ($_SERVER['DOCUMENT_ROOT']).

В обоих случаях также убедитесь, что вы доставляете разрешенные файлы (например, что происходит, если злоумышленник использует /protect.php/protect.php). Это может привести к утечке конфиденциальных данных.

PS: Возможно, вы также захотите сделать ответ не кешируемым или предоставить Content-Length.

PSS: Даже для запрещенного случая вам также необходимо предоставить правильный Content-Type - или использовать перенаправление (header('Status: 302'); и header("Location: https://placeholdit.imgix.net/~text?txtsize=38&txt=Forbidden&w=400&h=400");), так что вам не нужно повторно запрашивать это изображение снова и снова.

+0

Кажется замечательным, но я получаю странные символы –

+0

Когда я напрямую обращаюсь к файлу ex: url/filename.jpg –

+0

Я не понимаю, что вы подразумеваете под странными символами. – MrTux

Смежные вопросы