[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вставка большого объема текста
maximka787
Ребят, привет. Сделал небольшой скрипт и к нему защиту. Поле на 3000 знаков. Подскажите пожалуйста это надежный метод? Отфильтровал все кроме русских букв и цифр. Сами понимаете в такой размер можно много гадостей вставить.
$sql = 'INSERT INTO `tab` (`user`,`r`,`text`) VALUES ';

foreach ($_POST['text'] as $key => $value)
{
$value = preg_replace('/[^0-9А-Яа-яёЁ\d ]/u', '', $value);
$value = trim($value);
$sql .= "(".intval($user).",".intval($key).",'".mysql_real_escape_string($value)."'),";
}

...




Спустя 5 минут, 22 секунды (23.04.2012 - 10:51) Nikitian написал(а):
Что это за текст на 3к знаков без знаков препинания? Люди иногда их используют и даже частенько по правилам smile.gif
Я уж не говорю про дефисы и использование символов со всякими умляутами... А ещё есть перевод строки, псевдографика.

Спустя 11 минут, 45 секунд (23.04.2012 - 11:02) maximka787 написал(а):
Nikitian
Жестоко, что-то я не подумал)) а как тут лучше поступить? дополнить регулярное выражение этими символами? Мне железно нельзя пропускать кавычки, тире, двоеточия, англ буквы.

Спустя 5 минут, 55 секунд (23.04.2012 - 11:08) yurayu92 написал(а):
А почему не сделать проверку через preg_match?
+ У тебя по окончению цикла получится такая строка:
"INSERT INTO ... ),"
То есть в окончание есть запятая

Спустя 4 минуты, 50 секунд (23.04.2012 - 11:13) Nikitian написал(а):
Цитата (maximka787 @ 23.04.2012 - 12:02)
Мне железно нельзя пропускать кавычки, тире, двоеточия, англ буквы.

При таких условиях как-то так:

$value = preg_replace('/[A-Za-z\"\\\'\:\-]/u', '', $value);

Может запутался в бэкслешах, не проверял.

Имхо, от пользователя надо всё принимать, просто экранировать при вводе и выводе. Редко когда такие ограничения накладываются внешними факторами.

Спустя 5 минут, 44 секунды (23.04.2012 - 11:19) maximka787 написал(а):
yurayu92
у меня там ... в коде как раз запятую и стирают)))

Nikitian
Там идут рецензии и они должны быть только на русском причем без премодерации и самое главное от любых юзеров (не зарегистрированных), то есть жестокие условия))) Я проверю твое выражение и думаю оно подойдет. спасибо.

Спустя 5 минут, 24 секунды (23.04.2012 - 11:24) killer8080 написал(а):
Цитата (maximka787 @ 23.04.2012 - 11:45)
Сделал небольшой скрипт и к нему защиту.

защиту от чего? От инъекций ненужно ничего кроме, экранирования слешей (mysql_real_escape_string) для текстовых полей и приведение к типу для числовых, все остальное не имеет смысла.

Спустя 2 минуты, 12 секунд (23.04.2012 - 11:26) Renden написал(а):
killer8080
Во-во я тоже прочитал не понял нафига тут регулярка)

Спустя 16 минут, 34 секунды (23.04.2012 - 11:43) Nikitian написал(а):
Цитата (maximka787 @ 23.04.2012 - 12:19)
yurayu92
у меня там ... в коде как раз запятую и стирают)))

Nikitian
Там идут рецензии и они должны быть только на русском причем без премодерации и самое главное от любых юзеров (не зарегистрированных), то есть жестокие условия))) Я проверю твое выражение и думаю оно подойдет. спасибо.

Ну тогда правильнее будет сделать несколько уровней проверки:
* Нет кириллицы - сообщать, что сообщения должно содержать кириллицу. Для набора без использования русской раскладки можно использовать виртуальную клавиатуру
* Вырезать все неугодные теги, если предполагается вывод в виде html. Предпочитаю для вырезания тегов использовать это.
* При записи в бд разумеется необходимо всё экранировать через mysql_real_escape_string(), ну это вы и так делаете.
* Если вывод предполагается не как html, то выводить через nl2br(htmlspecialchars())
Всё, этим вы не будете ущемлять пользователей сверх меры и не дадите им загадить сайт xss или ссылками

Спустя 30 минут, 29 секунд (23.04.2012 - 12:13) maximka787 написал(а):
Nikitian
спасибо, сейчас попробую что-то взять отсюда.

Renden и killer8080
Я наверно ошибся, защиту от инъекций я и сделал через mysql_real_escape_string. Там суть была в фильтрации логической, но уже все решил, буду дальше дорабатывать.

Спустя 13 минут, 34 секунды (23.04.2012 - 12:27) maximka787 написал(а):
Nikitian
вот я сделал
$value = preg_replace('/[\"\\\'\:\-\`<>~=+^]/u', '', $value);

А вопрос такой в мою конструкцию как разрешить перенос строки?

$value = preg_replace('/[^,.0-9А-Яа-яёЁ\d ]/u', '', $value);

пытался добавить \n но не сработало.

Спустя 1 минута, 25 секунд (23.04.2012 - 12:28) killer8080 написал(а):
Цитата (maximka787 @ 23.04.2012 - 13:27)
А вопрос такой в мою конструкцию как разрешить перенос строки?

\s - любые пробельные символы

Спустя 2 минуты, 29 секунд (23.04.2012 - 12:31) maximka787 написал(а):
killer8080
спасибо, вт так дописал
$value = preg_replace('/[^,.0-9А-Яа-яёЁ\s\d ]/u', '', $value);

Спустя 6 минут, 52 секунды (23.04.2012 - 12:38) killer8080 написал(а):
maximka787
обычный пробел из символьного класса теперь можешь выбросить, и перечисление цифр 0-9 ненужно, у тебя же там есть \d, так же вместо перечисления строчных и прописных букв можно просто добавить модификатор i.
кстати точку надо экранировать
'/[^,\.а-яё\s\d]/ui'

Спустя 1 минута, 55 секунд (23.04.2012 - 12:40) maximka787 написал(а):
killer8080
Благодарю, вот это познания, столько нового)


_____________
..Работает - не трогай!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2026 Invision Power Services, Inc.