diff --git a/README.md b/README.md index e89b5b1..38582ad 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ * Файлы * Авторы могут загружать в свои комментарии разрешенные в Админ панели файлы. * Размер и тип файла задаются в Админ панели. Отдельные права для Анонимов. Для изображений выводятся их превью, для остальных превью с именем расширения этого файла. - + * Важно! Разрешив загрузку файлов, особенно Анонимам - вы подвергаете свой сайт дополнительным рискам! Относитесь к этой функции с максимальной острожностью. * Дополнительные поля * Два дополнительных поля, их названия и обязательные или нет, настраиваются в Админ панели * Валидация обязательных полей на заполненность + проверка на разрешения для файлов diff --git a/class/comment.php b/class/comment.php index e60eb62..7d6524f 100644 --- a/class/comment.php +++ b/class/comment.php @@ -714,9 +714,24 @@ if ($is_allowed_ext && !$is_dangerous && $file['size'] > 0 && $file['size'] <= $ if ($user_rating < 0) $user_rating = 0; if ($user_rating > 5) $user_rating = 5; $new_comment['user_rating'] = $user_rating; - $comment_text_raw = $_POST['comment_text'] ?? ''; - $comment_text_clean = strip_tags(stripslashes($comment_text_raw)); - $new_comment['comment_text'] = addslashes($comment_text_clean); + // --- ПОДГОТОВКА И ОБРАБОТКА ТЕКСТА КОММЕНАТРИЯ ЖЕСТКАЯ (вырежет весь тест как только встретит < тег) --- + //$comment_text_raw = $_POST['comment_text'] ?? ''; + //$comment_text_clean = strip_tags(stripslashes($comment_text_raw)); + //$new_comment['comment_text'] = addslashes($comment_text_clean); + + // --- ПОДГОТОВКА И ОБРАБОТКА ТЕКСТА КОММЕНАТРИЯ МЯГКАЯ (с соранением в виде специальных сущностей) --- + // 1. Получаем сырой текст + $comment_text_raw = $_POST['comment_text'] ?? ''; + + // 2. Убираем лишние слеши + $comment_text_raw = stripslashes($comment_text_raw); + + // 3. ПРЕВРАЩАЕМ теги в текст (экранируем), а не вырезаем их + // Теперь Query("INSERT INTO " . PREFIX . "_module_comment_info (`" . implode('`,`', array_keys($new_comment)) ."`) VALUES ('" . implode("','", $new_comment) . "')"); $new_comment['Id'] = $AVE_DB->InsertId(); @@ -803,18 +818,34 @@ function commentPostEdit($comment_id) } // Обработка текста - $comment_text = $_POST['text'] ?? ''; - - $comment_text = preg_replace_callback('/&#x([0-9a-f]{1,7});/i', function($matches) { return chr(hexdec($matches[1])); }, $comment_text); - $comment_text = preg_replace_callback('/&#([0-9]{1,7});/', function($matches) { return chr($matches[1]); }, $comment_text); - - $comment_text = stripslashes($comment_text); - $comment_text = str_replace(array("
\n", "
\n", "
\n", "
", "
"), "\n", $comment_text); - $comment_text = strip_tags($comment_text); - - $max = ($row['comment_max_chars'] > 10) ? (int)$row['comment_max_chars'] : 1000; - $comment_text_cut = mb_substr($comment_text, 0, $max); - if (mb_strlen($comment_text) > $max) $comment_text_cut .= '…'; +// 1. Получаем текст +$comment_text = $_POST['text'] ?? ''; + +// 2. Убираем слеши +$comment_text = stripslashes($comment_text); + +// 3. Декодируем сущности (чтобы не было &lt;) +$comment_text = html_entity_decode($comment_text, ENT_QUOTES, 'UTF-8'); + +// 4. УБИРАЕМ ДУБЛИРОВАНИЕ СТРОК: +// Сначала превращаем все варианты переносов (Windows \r\n, Mac \r) в единый \n +$comment_text = str_replace(array("\r\n", "\r"), "\n", $comment_text); + +// Теперь заменяем
(если они есть) на \n, но так, чтобы не создавать лишних пустых строк +$comment_text = preg_replace('/\n?/i', "\n", $comment_text); + +// Удаляем лишние пробелы в концах строк (необязательно, но полезно) +$comment_text = implode("\n", array_map('trim', explode("\n", $comment_text))); + +// 5. БЕЗОПАСНОСТЬ: Экранируем обратно для базы +$comment_text = htmlspecialchars($comment_text, ENT_QUOTES, 'UTF-8'); + +// 6. Ограничение по длине (как у тебя и было) +$max = ($row['comment_max_chars'] > 10) ? (int)$row['comment_max_chars'] : 1000; +if (mb_strlen($comment_text) > $max) { + $comment_text = mb_substr($comment_text, 0, $max) . '…'; +} +$comment_text_cut = $comment_text; // Работа с изображениями (МУЛЬТИЗАГРУЗКА И УДАЛЕНИЕ) diff --git a/js/comment.js b/js/comment.js index eba9b22..395c2db 100644 --- a/js/comment.js +++ b/js/comment.js @@ -587,7 +587,10 @@ $doc.off('click', '.mod_comment_edit').on('click', '.mod_comment_edit', function $('.mod_comment_text').show(); $('.mod_comment_attached_image, .comment-files').show(); - var cleanText = $textBlock.html().replace(//mg, "\n").trim(); + // сначала декодируем HTML обратно в текст, а регулярка теперь «съедает» и тег, и возможный перенос после него + var cleanText = $textBlock.html() + .replace(/\n?/gi, "\n") // Убираем
и ОДИН символ переноса за ним, если он есть + .trim(); // --- СБОР ТЕКУЩИХ ВЛОЖЕНИЙ --- var existingImagesHtml = '';