.htaccess защита загрузки личных файлов из каталога пользователя с помощью переполнения стека

Мой php-скрипт создает каталог пользователя для хранения личных файлов, и мне нужно сохранить его в секрете, кроме владельца.

В основном моя структура такова:

- root/
- storage/
---- users/
----------user1/
---------------.htaccess
---------------images/
---------------tmp/
-------------------session-id-file
----------user2/
---------------.htaccess
---------------images/
---------------tmp/
-------------------session-id-file

Это означает, что когда новый пользователь регистрируется, то в / storage / users создается каталог нового пользователя:

$dir = __DIR__ . "/storage/user/" . $user["id"];
mkdir($dir);

Затем внутри создается новый .htaccess:

 $myfile = fopen($file, "w") or die("Unable to create file!");
$txt = "RewriteCond %{HTTP_COOKIE}        PHPSESSID=(\w+)\n
**RewriteCond {CURRENT-DIRECTORY}/tmp/access-%1      -f \n**
RewriteRule ^(.+)$  $1  [L]\n
RewriteRule .+  /deny   [L]\n";
fwrite($myfile, $txt);
fclose($myfile);

.Htaccess выглядит как:

RewriteCond %{HTTP_COOKIE}        PHPSESSID=(\w+)
RewriteCond {CURRENT-DIRECTORY}/tmp/access-%1      -f
RewriteRule ^(.+)$  $1  [L]

RewriteRule .+  /deny   [L]

Когда пользователь входит в систему, новый ID-файл сессии создается в пользовательском каталоге tmp:

touch($dir . "/tmp/" . session_id());

Мой вопрос: как обнаружить {текущий каталог}, где находится htaccess? Как исправить неправильную строку в .htaccess:

        RewriteCond {CURRENT-DIRECTORYY}}/tmp/access-%1      -f \n

Я видел подобный вопрос, но я не могу обнаружить текущий каталог на основе каталога, созданного на лету.

Хорошим вариантом может быть использование только одного .htaccess в каталоге / users вместо множества .htaccess для каждого пользователя, как я делал в своем примере.

Спасибо за любое предложение 🙂

1

Решение

Прежде всего, вы можете изменить:

RewriteRule ^(.+)$ $1 [L]

Для того, чтобы:

RewriteRule ^ - [L]

Что означает то же самое. - можно сказать, что не делайте никаких изменений, просто примените флаги.

Для отрицания, вы можете сделать это правильно, используя [F] флаг, чтобы вернуть 403 запрещено, вместо 200 переписать в /deny, Вот так:

RewriteRule ^ - [F,L]

Если вы все еще хотите содержимое /deny должен быть возвращен, затем добавить ErrorDocument директива для 403 и указать на этой странице.

Для записи в файл в PHP, вы можете просто использовать file_put_contents вместо этих трех призывов к fopen, fwrite а также fclose, Увидеть документация.

Чтобы ответить на ваш актуальный вопрос, для текущего каталога вы не можете получить его напрямую из RewriteCond переменные, но вы можете просто записать его в файл при генерации с помощью PHP.

Вот пример этого с другими предлагаемыми изменениями:

$txt = "RewriteCond %{HTTP_COOKIE} PHPSESSID=(\w+)\n
RewriteCond $dir/tmp/access-%1 -f\n
RewriteRule ^ - [L]\n
RewriteRule ^ - [F,L]\n";
file_put_contents($myfile, $txt) or die("Unable to create file!");

Так делается, например:

RewriteCond %{HTTP_COOKIE} PHPSESSID=(\w+)
RewriteCond /root/storage/users/userid/tmp/access-%1 -f
RewriteRule ^ - [L]
RewriteRule ^ - [F,L]
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]