Как не указывать имя файла в данных поста?

0

Я написал следующий код, и мне интересно, есть ли лучший способ сделать то, что я хочу.

В принципе, код считывает несколько файлов и записывает HTML-формы для редактирования каждого из них. Я отправляю имя файла через данные POST, но это похоже на угрозу безопасности для этого.

Есть ли лучший или правильный способ сделать то, что я делаю?

Код:

<?php

    foreach (glob('*.html', GLOB_NOSORT) as $file) {
        echo '<form action="write.php">';
        echo '<textarea name="' . basename($file, '.html') . '" cols="80" rows="20">' . file_get_contents($file) . '</textarea>';
        echo '<input type="hidden" name="file" value="' . $file . '"><br><br>';
        echo '<input type="submit" value="Save Edit"><br><br>';
    }

?>
  • 4
    Если пользователю разрешено редактировать ваши файлы, разве он не заслуживает доверия?
  • 1
    Или, если сформулировать это по-другому: если ненадежный пользователь уже может редактировать файлы на вашем сервере, разве у вас нет проблем хуже, чем раскрытие имени файла?
Показать ещё 1 комментарий
Теги:
security
forms

2 ответа

4
Лучший ответ

Пусть на данный момент игнорируется, что вы позволяете пользователю редактировать файлы на стороне сервера. Я просто предполагаю, что вы разобрали все проблемы аутентификации/авторизации/впрыска, и единственная проблема, с которой вы столкнулись, - это имя файла.

Таким образом, вы не хотите, чтобы пользователь знал/обезглавливал ваши имена файлов. Вместо того, чтобы записывать имя на страницу, создайте длинный и случайный токен, который вы связываете с редактируемым файлом. Затем, когда сообщение возвращается, найдите токен, и вы знаете, какой файл редактируется. Если вы вернете токен, который вы не узнаете, вы можете отказаться от запроса. Со стороны HTML все, что видит пользователь, является непрозрачным токеном. Имя файла никогда не покидает ваш сервер.

Теперь, когда у нас это есть, вернитесь к пункту 1 и убедитесь, что у вас есть все эти флажки. Здесь потенциально гораздо хуже, чем имя файла.

0

Безопасность/проверка на стороне клиента всегда должны строиться поверх надежных эквивалентов на стороне сервера. И если вы не можете позволить себе оба, только последний является обязательным.

Если ваш внутренний код выглядит так:

$fp = fopen($_POST['file'], 'w');
fwrite($fp, $_POST[basename($_POST['file'], '.html')]);
fclose($fp);

... Реальная проблема заключается в том, что вы предоставляете доступ на запись к своему полному жесткому диску. Это эквивалент хранения ваших SQL-запросов в формах.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню