Язык
Контакты
GitHub
Поддержка
Регистрация
Войти
Логин: Пароль: Запомнить:
Пользователи
Последние сообщения
Ответить
1 2 3

Заквотивание или фильтр или проверка допустимого в тексте

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#1
Вот столкнулся с проблемой, надо запрещать отправлять юзеру в форме отдельные символы и позволять иные.

Знаю, что это делает ф-ция preg()

Но вот не понял как она работает

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#2
самая лучшая для этого функция это preg_match(). К тому же она и самая быстрая. Но вот методы построения шаблонов или так называемые регулярные выражения, которые используются в этих функциях это краеугольный камень программистов. многие вю жизнь работают кодерами и не знают их и на половину)) Но лично мне они не показались сложными, я попробую объяснить как это работает. К стати более исчерпывающую информацию по ним чем в официальной доке ПХП вы не найдете. Я именно там их и учил.

например нам надо пропустить только какие то символы

 1 
 2 
 3 
<?php if( preg_match('#^[тут просто пишем подряд все символы которые можно пропустить]+$#'$_POST['name'])) {
    echo 
'прошла';
}
?>

квадратные скобки там не просто так они нужны.
символы ^ и $ обозначают начало и конец строки
символы # это просто правило регулярок. Заключайте их в кавычки и эти символы.
символ + после скобок означает что символов в строке может быть сколько угодно но не меньше одного (* - означает ноль и больше)
а сами квадратные скобки служат символьным класом точнее контейнером для него. все что между ними будет считаться разрешенными символами.
Обрати внимание что не все символы можно просто написать, некоторые имеют рабочее назначение и по этому их надо экранировать обратным слешом \.

иногда бывает быстрее перечислить что нельзя пропускать чем что можно. это можно сделать так
 1 
 2 
 3 
<?php if( preg_match('#^[^тут просто пишем подряд все символы которые нельзя пропустить]+$#'$_POST['name'])) {
    echo 
'прошла';
}
?>
тут ^ внутри квадратных скобок играет роль отрицания. Другими словами - "пропустить все кроме того что прописано в этом блоке"


но это еще не все квотирование. что если пользователь напишет в посте HTML код и он так и выведется на страницу? страница может быть сьехавшей или вообще измененной. пользователь даже может внедрить скрипт. Это называется XSS - такой вид уязвимости.

что бы HTML код вывелся как простые символы надо перед выводом на экран квотить данные функцией
 1 
 2 
<?php htmlspecialchars($str);?>

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#3
В кодировке UTF8 не пропускаются русские символы, как исправить? "/ui" не заработал

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#4
ну странно, я как раз думал предложить модификатор "u". А можно тогда увидеть всю регулярку? Еще стоило бы проверить чтобы весь документ был в утф. Так как модификатор "u" лишь говорит о том что обрабатывать выражения надо в юникоде(utf) а если их отправка происходит не в утф могут происходить траблы.

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#5
все документы в UTF8. Дать код не могу ибо только во вторник получу его назад

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#6
skad0 пишет:
все документы в UTF8. Дать код не могу ибо только во вторник получу его назад
в любом случае это не мешает сделать маленький тестовый файлик и потестить саму функцию. это стоит сделать хотя бы даже ради общего развития.

 1 
 2 
<?php $text 'русскиебуквыблин';
if (
preg_match('##'$text)) echo 'OK';?>

вот что-то типо этого

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#7
Если посты проходят htmlspecialchars то preg_match же не нужен?

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#8
htmlspecialchars лиш гарантирует что HTML теги не будут работать в тексте а будут отображаться как есть. А прег матч служит для того чтобы не пропускать определенные символы. Если ты не хочешь чтобы юзеры тулили в заголовки какието определенные символы то htmlspecialchars тебе тут не поможет никак и нужно юзать прег чтобы их отловить а если тебе все равно что там будут за символы тогда прег не нужен.

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#9
Цитата
htmlspecialchars лиш гарантирует что HTML теги не будут работать в тексте а будут отображаться как есть. А прег матч служит для того чтобы не пропускать определенные символы. Если ты не хочешь чтобы юзеры тулили в заголовки какието определенные символы то htmlspecialchars тебе тут не поможет никак и нужно юзать прег чтобы их отловить а если тебе все равно что там будут за символы тогда прег не нужен.

А это не повредит безопасности?

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#10
нет. просто прогоняй все данные в которых не должен работать HTML перед выводом через htmlspecialchars. А те данные в которых должен работать HTML не должны содержать этого рабочего HTML от пользователей. А то они смогут и джаву вставить туда и все что угодно и это бцдет XSS то есть уязвимость. Для этого и придумали бб коды чтобы дать возможность людям размечать текс но при этом не юзать HTML. То есть они просто юзают заранее подобранный список команд таким образом не подвергая тебя опасности.

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)
1 2 3
Сейчас online: 41. Зарегистрированных: 1. Гостей: 40.