Нужно ли проверять загруженные файлы (PHP), если они не будут храниться на сервере? - PullRequest
0 голосов
/ 20 июля 2010

У меня есть тема WordPress со страницей настроек. Я включил базовую функцию экспорта / импорта. Функция экспорта позволяет пользователям загружать параметры в текстовый файл .dat и сохранять их на своем компьютере. Кнопка параметров импорта читает файл .dat и перезаписывает текущие параметры в базе данных. Затем файл удаляется в конце выполнения скрипта (не сохраняется на сервере).

Нет отдельных файлов uploads.php, все происходит в одном скрипте (экспорт, импорт и т. Д.).

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

Пользователь может получить доступ к этой форме, только если он вошел в панель управления WordPress с правами администратора.

Так что в этой форме импорта нет необходимости иметь расширенные функции безопасности, не так ли? Кроме, может быть, я должен попробовать это с файлами .sql и посмотреть, что может произойти? Может ли кто-нибудь создать файл .sql и уничтожить всю базу данных? Должен ли я занести в черный список .sql файлы, чтобы быть в безопасности?

Вот мой код импорта:

   if ( $_GET['page'] == basename(__FILE__) ) {
        if ( 'export' == $_POST['action']) {
        cpress_export();
    }   
    if (isset($_FILES['settings'])){
        if ($_FILES["settings"]["error"] > 0){
            echo "Error: " . $_FILES["settings"]["error"] . "<br />";
          } else{
            $rawdata = file_get_contents($_FILES["settings"]["tmp_name"]);
            $cp_options = unserialize($rawdata);
            update_option('cpress_options', $cp_options);
            header("Location: themes.php?page=options_page.php&import=true");
          }
    }

А вот мой код экспорта (в том же файле):

function cpress_export(){
$settings = get_option('cpress_options');
$file_out = serialize($settings);
header("Cache-Control: public, must-revalidate");
header("Pragma: hack"); 
header("Content-type: text/plain; charset=ISO-8859-1");
header('Content-Disposition: attachment; filename="cpress-options-'.date("Ymd").'.dat"');
echo $file_out;
exit;}

Ответы [ 2 ]

2 голосов
/ 21 июля 2010

Я бы порекомендовал пару улучшений:

  1. Используйте if (!defined('ABSPATH')) die() в начале вашего плагина - если злонамеренный пользователь попытается загрузить ваш скрипт напрямую, он потерпит неудачу,поскольку константа WordPress ABSPATH не определена.

  2. Используйте одноразовые номера WordPress - это по крайней мере сделает жизнь неприятного человека немного сложнее:)

  3. Убедитесь, что unserialize() не дает сбоя (в противном случае это будет логическое значение false) - это произойдет, если сериализованные данные были искажены (или не были сериализованы с самого начала).Если произойдет сбой, не продолжайте обновление.

  4. Используйте wp_safe_redirect() вместо header() для вашего перенаправления (фактически вам следует всегда используйте эту функцию при перенаправлении на другие страницы администратора WP - в противном случае используйте wp_redirect()).

2 голосов
/ 20 июля 2010

Если вы читаете из файла и загружаете этот файл в базу данных, то, безусловно, есть возможность для эксплуатации.Однако, если это включено только для администраторов, то я не знаю, сколько усилий нужно приложить для защиты от вредоносной активности.Если они администраторы, есть гораздо более простые вещи, которые они могли бы сделать, чтобы стереть базу данных.

Как правило, вероятно, стоит приложить некоторые усилия, чтобы пользователи не могли случайно ничего испортить, ноудерживать пользователей-администраторов от злонамеренных действий не стоит усилий и не согласуется с идеей роли администратора.Это все равно, что дать кому-то su привилегии на компьютере с Linux и убедиться, что он не может установить на него вредоносное ПО.

edit: Я проверил документы Wordpress и update_option () Функция экранирует строку перед выполнением запроса.Вы должны быть защищены от SQL-инъекций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...