Итак, после поиска решения по всему сообществу мой вопрос выглядит следующим образом:
Я работаю в среде Wordpress, сервере Apache.У меня есть папка в загрузках с именем /restricted/
.Все здесь (любое расширение файла) может быть доступно только в том случае, если :
- Файл cookie с именем 'custom_cookie' установлен
- И это значение cookie должно быть частичным совпадением запроса URL
. Если эти условия не выполняются, изображение передается.Внутри этой папки /restricted/
я получил файл .htaccess
.Все должно (предпочтительно) быть сделано в этом файле htaccess, не в корневом файле htaccess.
Файл cookie устанавливается functions.php, никаких проблем с этой частью нет.И комментарии о безопасности здесь не вопрос
Это пример URL (localhost): http://localhost/komfortkonsult/wp-content/uploads/restricted/some-file.jpg?r=870603c9d23f2b7ea7882e89923582d7
Условие first Cookieс именем custom_cookie установлено , все работает с этим:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /komfortkonsult/
RewriteCond %{REQUEST_URI} ^.*uploads/restricted/.*
RewriteCond %{HTTP_COOKIE} !custom_cookie
RewriteRule . /komfortkonsult/restricted.png [R,L]
</IfModule>
Тем не менее, следующая часть Im полностью отсутствуетсиний , но я попытался и потерпел неудачу со следующими подходами:
RewriteCond %{HTTP_COOKIE} custom_cookie=(.*)$
RewriteCond %1::%{REQUEST_URI} ^(.*?)::/\1/?
RewriteRule . /komfortkonsult/restricted.png [R,L]
Аналогично:
RewriteCond %{QUERY_STRING} ^r=(.*)$
RewriteRule ^/ - [E=COOKIE_MATCH:%1]
RewriteCond %{HTTP_COOKIE} !custom_cookie="%{ENV:COOKIE_MATCH}"
RewriteRule . /komfortkonsult/restricted.png [R,L]
Аналогично:
RewriteCond %{HTTP_COOKIE} custom_cookie=([^;]+) [NC]
RewriteCond %{REQUEST_URI} !%1 [NC]
RewriteRule . /komfortkonsult/restricted.png [R,L]
И так далее.Я действительно хочу сохранить это внутри .htaccess
, вместо этого используя проверку через .php
файловый вызов.Но , если это единственное решение для моей архитектуры, , предоставьте полный рабочий пример (не foo = bar, ваши перенаправления идут сюда ...)
Любые другие подходы к моим целям приветствуются.
Большое спасибо за помощь в этом.
/ Intervik
Обновление (после принятого ответа и работы) пример использования
Цели: один уровень защиты в одиночной установке Wordpress.Все файлы мультимедиа, изображения или другие файлы, загруженные и прикрепленные к страницам, скрыты (заменены изображением) , если A) , пользователь не являетсявошел в систему или B) Пользователь зарегистрирован в , но не с возможностью 'edit_post' .
Но ограничение распространяется только на файлы, загруженные в уникальную папку с именем /restricted/
.Папка находится в корневом каталоге Wordpress /uploads/
.Этот запрещенный материал не может быть напрямую связан или доступен для поисковых систем и т. П.И еще ... но я думаю, что вы поняли.
Пространство имен 'custom_cookie'
является просто примером.А примеры, показывающие установку Wordpress, находятся в подпапке на localhost.НРАВИТСЯ h**p://example.com/workspace/
.Удалите 'workspace/'
, если он находится в корне.
Архитектура cookie, functions.php
function intervik_theme_set_custom_cookie(){
if(is_user_logged_in()){
global $current_user;
if(current_user_can('edit_posts')){
if(!isset($_COOKIE['custom_cookie'])){
$cookie_value = $current_user->ID . '|' . $current_user->user_login . '|' . $current_user->roles;
$salt = wp_salt('auth');
$cookie_hash = hash_hmac('md5', $cookie_value, $salt);
setcookie('custom_cookie', $cookie_hash, time()+36, '/');
$_COOKIE['custom_cookie'] = $cookie_hash;
} else {
$cookie_value = $current_user->ID . '|' . $current_user->user_login . '|' . $current_user->roles;
$salt = wp_salt('auth');
$cookie_hash = hash_hmac('md5', $cookie_value, $salt);
if($cookie_hash != $_COOKIE['custom_cookie']){
setcookie('custom_cookie', '', 1, '/');
unset($_COOKIE['custom_cookie']);
}
}
} else {
if(isset($_COOKIE['custom_cookie'])){
setcookie('custom_cookie', '', 1, '/');
unset($_COOKIE['custom_cookie']);
}
}
} else {
if(isset($_COOKIE['custom_cookie'])){
setcookie('custom_cookie', '', 1, '/');
unset($_COOKIE['custom_cookie']);
}
}
}
add_action('init', 'intervik_theme_set_custom_cookie');
Как видите, каждый файл cookie уникален для каждого действительного пользователя , для каждого периода +36 секунд (достаточно для загрузки страницы - но используйте +120 в течение 2 минут).Этот «токен» применяется к каждому запросу, отправляемому на сервер:
Ссылка на фильтр URL вложения:
function intervik_restricted_wp_get_attachment_url($url, $post_id){
if(strpos($url, '/restricted/') !== FALSE){
if(isset($_COOKIE['custom_cookie'])){
$url = add_query_arg('r', $_COOKIE['custom_cookie'], $url);
}
}
return $url;
}
add_filter('wp_get_attachment_url', 'intervik_restricted_wp_get_attachment_url', 10, 2);
Мы не разрешаем другие запросыстроки.Заметьте, для размеров необходимо добавить дополнительный фильтр, например wp_get_attachment_image_src
и т. Д. Но прямых ссылок на носители достаточно.
Замена if(current_user_can('edit_posts')
другим if(is_user_logged_in() ...
изменяет все на простовход / выход пользователей.Затем пропустите фильтры в админ-панели с i f(!is_admin()
&& strpos($url, '/restricted/')!== FALSE) ...
И, наконец, файл .htaccess
в корне папки uploads/restricted/
:
# BEGIN Intervik
Options +FollowSymLinks
Options All -Indexes
<IfModule !mod_rewrite.c>
Deny from all
</IfModule>
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
RewriteEngine On
RewriteCond %{HTTP_COOKIE}::%{QUERY_STRING} !\bcustom_cookie=([0-9a-f]{32})\b.*::r=\1(&|$)
RewriteRule . /workspace/restricted.png? [R,L]
# END Intervik
Я также поместил красивое PNG-изображение «Тайм-аут ограниченного доступа» в корень установки Wordpress.Это также используется в качестве эскиза в области администрирования библиотеки для недействительных администраторов.Фильтр загрузки или серверная часть - это еще одна область.
Мы не защищаем здесь финансовые планы Englands, но мы хотим сохранить некоторые документы для организации и некоторые изображения от Google и отваша жена.
Пожалуйста, прокомментируйте
Это действительно работает, и вы можете прокомментировать недостатки или угрозы безопасности.Тем не менее, в нашей установке есть еще один уровень проверки с PHP выше этого уровня, но нам нужна скорость для не столь важных вещей.