Максим Покровский

— Привет, меня зовут Максим Покровский. Вы находитесь в моем рабочем кабинете. Поскольку я фрилансер, будем считать, что именно так он и выглядит. Здесь я пишу много интересных вещей, и если вы почувствовали, что я именно тот человек, который вам нужен, то я всегда открыт для контакта.

Сейчас работаю над:


  • Разработка одного стартапа

    Текущий статус - разработка дизайн.

  • Много всего для popsop.com

Заказать мне работу
21.05

Как сделать upload в комментариях

Комментарии (15) wordpress

Возникла необходимость сделать возможность добавления файлов пользователями в комментариях. С последующем выводом ссылки в комментарии. Сделал так:

Добавляем соответствующее поле
<input type="file" />
Исправляем comments.php

Меняем

<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">

на

<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php"
method="post" id="commentform" enctype="multipart/form-data">

(т.е. добавить атрибут enctype=”multipart/form-data” что бы можно было
закачивать файлы)

3. Правим файл wp-comments-post.php

После

if ( '' == $comment_content )
    wp_die( __('Error: please type a comment.') );

(ориентировочна 58-60 строки)
добавить следующее:

/*! comment-upload plugin start
 *
 * Если расширение файла не разрешенно(устанавливается в массиве
$dissallowed_ext), то к имени файла дописывается ".txt"
 */

if (isset($_FILES['cu_file'])==true)
{
    $uploaddir = './wp-content/uploads/';
    $fn = basename($_FILES['cu_file']['name']);
    $uploadfile = $uploaddir . $fn;

    /*! @todo add test for extension */
    $disallowed_ext = array ('exe','php','php3','php4','php5','phtml');
    $allow = true;
    preg_match( '#\.([a-zA-Z0-9\-_]+)$#', $fn, $match );
    if (count($match)>0)
    {
        if (isset($match[1])==true)
        {
            if (in_array($match[1],$disallowed_ext)==true)
                {
                    $uploadfile .= ".txt";
                    $fn .= ".txt";
                    //$comment_content .= "файл переименован";
                }
        }
    }
    if ($allow==true)
        if (move_uploaded_file($_FILES['cu_file']['tmp_name'],
$uploadfile)) {
            /* ok */
            $comment_content .= "<br /><br />Загруженный файл: <a
href=\""
. get_option('siteurl') . "/uploads/" . $fn . "\">" . $fn .
"</a><br />" /*. print_r($match,true)*/;
           
        } else {
            /*bad*/
        }
   
}
/*! comment-upload plugin end */

В $disallowed_ext = array (’exe’,'php’,'php3′,’php4′,’php5′,’phtml’); дописать свои расширение, к которым будет добавляться .txt чтоб никто не догадался залить эксплоит ;-)
Т.е. если я закачаю shell.php он закачается как shell.php.txt

Тому кто это загонит все это в плагин — респект, почет и девствениц в раю.

Метки:,

Комментарии

  1. 1
    Vladimir (21.05.2008) #

    По ходу прошлый коммент не запостился…

    Максим, идея просто замечательная, после ужина реализуем плагинчик…

    Кстати, о плагинах… Какой-то из плагинов, обрабатывающих комментарии, сильно глючит: http://tigress.org.ua/test/bug.png (и bug2.png там же)
    Он плказывает комментарий ну явно из другой оперы :-(

    Т.е. если я закачаю shell.php он закачается как shell.php.txt

    А если я закачаю shell.PHP? :-) Сработает и в винде, и под Линуксом :-)

  2. 2
    Vladimir (21.05.2008) #

    Максим, если есть желание потестировать получившийся плагинчик, его можно скачать отсюда.

  3. 3
    Максим Покровский (22.05.2008) #

    По ходу прошлый коммент не запостился…

    Ты почту просто другую ввел.

    Какой-то из плагинов, обрабатывающих комментарии, сильно глючит: http://tigress.org.ua/test/bug.png (и bug2.png там же)

    Дикость какая-то. Что странно в Opera 9 и 9.5 все нормально показывается. Неужели это персональный баг 9.23

    А если я закачаю shell.PHP

    Серьезно? Даже не знал о такой возможности.

    Максим, если есть желание потестировать получившийся плагинчик, его можно скачать отсюда.

    Сегодня потестирую.

  4. 4
    Vladimir (22.05.2008) #

    Ты почту просто другую ввел.

    Ввёл-то другую, но комментарий даже не отобразился :-( Обычно система пишет, что комментарий ожидает модерации…

    Неужели это персональный баг 9.23

    Я в FF3/Linux… Сейчас в IE7 попробую…

  5. 5
    Максим Покровский (22.05.2008) #

    Бегло потестил плагин. Юзерская установка (скопировал, включил) не принесла успеха. Файл не скопировался в папку.

  6. 6
    Vladimir (22.05.2008) #

    У формы стоял правильный enctype (multipart/form-data)?

    Проблема в том, что я из плагина не могу поменять код шаблона, я могу только добавить поля (input для аплоада). Поэтому форму придется патчить ручками (можно, конечно, добавить JavaScript, но это не очень хорошо).

  7. 7
    Максим Покровский (22.05.2008) #

    У формы стоял правильный enctype (multipart/form-data)?

    Ага. У тебя работает?

  8. 8
    Vladimir (24.05.2008) #

    Ага. У тебя работает?

    Да, работает… Заходи, попробуй :-)
    Я подправил плагин, чтобы при неудачном аплоаде в тело комментария добавлялась диагностика:
    * wp_upload_dir() failed - проблема на стороне WordPress. Или с привилегиями не все в порядке;
    * File does not meet security guidelines - WordPress не разрешает загружать подобные файлы из соображений безопасности;
    * The uploaded file could not be moved to the destination directory - вероятнее всего, проблема с привилегиями.

    Плагин отказывается загружать пустые файлы, а также при подозрении на атаку (когда is_uploaded_file возвращает false).

    PS - проблема с комментариями исчезла… Виноват был AJAX?

  9. 9
    Гвидон Маляров (27.05.2008) #

    дык это к вордпрессу плагин? как-то нужно было сделать подобное, только комментарии отправлялись на сервер ajax-ом, за сим и с отправкой файлов пришлось извратиться:) использовал http://www.phpletter.com/Our-Projects/AjaxFileUpload/

  10. 10
    Vladimir (27.05.2008) #

    Тот, который AjaxFileUpload, на самом деле ну ни грамма ни AJAX (полагая, что одна из составляющих AJAX - это использование XmlHttpRequest). Банально создается скрытый iframe, target формы меняется на этот iframe, что создает иллюзию использования AJAX :-) Страница не перезагружается, перезагружается только iframe.

  11. 11
    Гвидон Маляров (27.05.2008) #

    про iframe это было ясно сразу:), сама тулзина из всех подобных больше всех понравилась. может есть чего еще лучше?

  12. 12
    Артемий (28.05.2008) #

    много мыслей в голове осталось после этой статьи. спасибо Вам

  13. 13
    Dosha (05.06.2008) #

    Благодарствую, полезная вещь.

  14. 14
    seo (23.06.2008) #

    У меня всё работает отлично! Автору респект!

  15. 15
    Vladimir (23.06.2008) #

    В любом случае, какой бы плагин вы не использовали, поместите .htaccess со строкой

    php_value engine off

    в каталог /wp-content/uploads. Так можно гарантировать, что нехороший человек не зальет вам шелл :-)

Оставить комментарий

Вы можете использовать простые теги форматирования HTML (вроде <a>, <ul> and others). Чтобы вставить пример код, используйте
<code lang="php">$a = "hello";</code> (поддерживаемые языки: ruby, php, yaml, html, css, csharp, javascript). Также Вы можете использовать <code>$a = "hello";</code>, синтаксис не будет подсвечен. Если вы не хотите использовать тег <code>, замените символ < на &lt;



— XP была бы отличной ОС,если бы с ней не поставлялся браузер.
Максим Покровский

Rambler's Top100