romikchef: (Default)
[personal profile] romikchef
Пишу гостевую книгу :-)
Заканчиваю уже, в общем.

Date: 2003-11-14 03:05 am (UTC)
From: [identity profile] clairseach.livejournal.com
Ссссссылку дают?

Date: 2003-11-14 06:14 am (UTC)
From: [identity profile] eugene-bond.livejournal.com
Угу... Ответы не работают...

Date: 2003-11-14 06:33 am (UTC)
From: [identity profile] eugene-bond.livejournal.com
Уже работают

Date: 2003-11-14 03:16 am (UTC)
From: [identity profile] xpundel.livejournal.com
получается? ;-))))))

Date: 2003-11-14 03:26 am (UTC)
From: [identity profile] eugene-bond.livejournal.com
А ты умеешь?

Date: 2003-11-14 04:05 am (UTC)
From: [identity profile] eugene-bond.livejournal.com
Ссылку в студию!

Хотя, я и так подозреваю... ;-)

Date: 2003-11-14 05:18 am (UTC)
From: [identity profile] eugene-bond.livejournal.com
Постраничку я делаю, в основном, как рассказывал на http://eugene.net.ru/other/php/portal/
кажись, в последней, на этот момент, 5-й главе...

Date: 2003-11-14 05:30 am (UTC)
From: [identity profile] eugene-bond.livejournal.com
Ну, дык, на то ты и программист!

Date: 2003-11-14 05:59 am (UTC)
From: [identity profile] eugene-bond.livejournal.com
Ну типа того. А был бы крутым дизайнером - на xhtml :-))

Date: 2003-11-24 12:20 pm (UTC)
From: [identity profile] david-m.livejournal.com
Забавно. Когда я брал программеров на работу, я предлагал им в качестве тест-задания написать гостебуку. Душераздирающие были зрелища...

Date: 2003-11-24 12:41 pm (UTC)
From: [identity profile] david-m.livejournal.com
Ну как... понятно, что написать гостебуку саму по себе никакого труда не составляет. Вся соль в нюансах.
Например, забывает ли товарищ резать HTML при выводе сообщений? А если потребовать, чтобы _некоторые_ теги таки были доступны - то как он решает эту задачу? Как обходится с оченьдлиннымисловами? А со ссылками в тексте? А с кучей \n подряд? А как у него гостебука листается? А как её можно взломать?
А как обстоят дела с дублями сообщений? А что она говорит, если забыть заполнить некоторые поля? А что будет, если нажать рефреш сразу после постинга? А запоминает ли она имя? А можно ли её постмодерить? А можно ли банить козлов?

А "не нравилось" мне то, что народ даже не начинал задумываться над этими вопросами. В лучшем случае ставил htmlspecialchars на выходе.

Посмотреть... исходник?

Date: 2003-11-25 03:08 am (UTC)
From: [identity profile] david-m.livejournal.com
На самом деле, идеала не бывает, и в реальной гостебуке вовсе не обязаны быть все эти фичи (да я, конечно, не все возможности перечислил - только те, что в голову пришли сразу). Но поскольку мы тогда искали именно веб-программера, то я должен был понять, осознаёт ли вообще товарищ, чем ему придётся заниматься? Понимает ли он, что его программой будут пользоваться совершенно непредсказуемым образом? Это то, что раньше называлось "защитой от дурака", только в веб-программинге это не одна из защит, а основная идеология написания. И вот чаще всего оказывалось, что человеку и в голову не могло придти, что юзер может нажать на submit, не заполнив все поля формы. Или нажать на submit не один, а два-три-четыре раза. Или в адресной строке наберёт отрицательный номер страницы. Или придёт не нормальные отзывы писать, а материться.

И, опять же, важно было не соблюдение этих требований, а отношение к ним. Например, автор гостебуки вполне мог сказать, что, поскольку гостебуку предполагается часто просматривать, то защиту от глюков форматирования (напр., \n\n\n\n\n) можно не делать - народ в гостебуке предполагается серьёзный, а ошибки исправит модератор. Но важно было, чтобы человек осознавал проблему и мог оценить риск.

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

Кстати, требования тоже могут взаимодействовать различным образом. К примеру, защита от длинных слов (путём переноса - как в хпоинте) и автообкладывание ссылок. Вот постанул юзер ссылку, к примеру, http://msdn.microsoft.com/library/default.asp?url=/workshop/author/om/doc_object.asp. Либо в неё сначала система переносов вставит [BR], а потом система ссылок попытается из этого сделать <a href...>, либо сначала система ссылок сделает <a href...>, а потом система переносов попытается разбить получившегося монстра. И то и то не слава богу. В общем, куча мелких подзадачек.

По нашим баранам: :)

- Зашёл на phpclub и первым делом углядел отсутствие защиты от символа "|" в имени и теле сообщения:) Я понимаю, что там это далеко не финальный вариант, но всё-таки в файловой гостебуке этим надо озаботиться (отчего, кстати, не сериалайзить записи serialize-ом?).

- Псевдотеги я лично не очень люблю (смысла в них не вижу), поэтому разрешаю юзерам использовать I,B,EM,STRONG,S,U и т.п. безатрибутные теги, благо их очень просто безопасным образом отловить. Но это дело вкуса, конечно.

- По поводу ссылок, могу порекомендовать очень простой код, который вполне успешно у меня работает на многих сайтах:
$Text = preg_replace('{((?:(?:https?|ftp)://|www\.)\S+)(?<![.,:;!?\)\<-])}','<a href="\1">\1</a>',$Text);
$Text = preg_replace('{<a href="www\.}','<a href="http://www.',$Text);


А вообще, наверное, было бы интересно взглянуть на код. Глядишь, и сам чему-нибудь научусь:)

P.S. Кстати, вспомнил ещё один, очень важный пункт. В каком виде хранятся сообщения в базе - в исходном, пришедшем от юзера, или в отформатированном? Поскольку есть мнение...

Date: 2003-11-25 07:38 am (UTC)
From: [identity profile] david-m.livejournal.com
> Ух ты!
> Ну и ответ.
> На статью тянет.

А сама тема тянет на хорошую книгу:) Только вот кто её напишет?

> По поводу \n.
> Идя домой, придумал совершенно примитивную защиту.
> if (substr_count($body,"\n") > $max_lines) ...
> То есть, не важно, пустые строки, или нет. Есть общее ограничение на их количество.

Хым. Как-то оно мне не очевидно. В сочетании с ограничением на длину постинга, мы получаем ограничение на среднюю длину строки, причём снизу (!). А если кто-то захочет Маяковского процитировать?:)

Я обычно просто делаю: preg_replace('/\n\n+/','<br><br>', $text) - т.е. два и более последовательных перевода строки заменяю на ровно два брека. Дёшево и сердито. А возиться с полным числом переносов мне как-то лень...

> По поводу поста на пхпклубе.
> Про палку - это кошмар. Она там, до вяческих исправлений, точно была.

Бывает:)

> Я даже искал html эквивалент в свое время для замены.

А зачем? Можно же любой символ использовать, только надо его правильно заслэшить в тесте (и разслэшить потом).

> Почему не сериализовать? Есть у меня на этот счет мнение. Вот такое:
> http://phpclub.net/talk/showthread.php?postid=195600#post195600
> http://xpoint.ru/forums/programming/PHP/thread/23528.xhtml

Н-ну, задача сортировки в ГБ не стоит, задача поиска... честно говоря, не видел ещё гостебуки с поиском. Читать глазами этот файл тоже вряд ли когда-нибудь будет нужно (а админский интерфейс на что?). Но, в принципе, мнение имеет право на жизнь, конечно.

> По поводу тегов/псевдотегов я пока не определился,если честно. И то мне не нравится, и это...
> Обычные теги, кроме того, что их надо фильтровать, надо еще и проверять на закрытие. А то весь дизайн поплыть может.

А псевдотеги, что, не надо проверять на закрытие? Я имею в виду не те, что на хпоинте, а те, что обычно делают в форумах - [i]...[/i], например. Те же яйца в другом ракурсе.

Я обычно, после того как отфильтрую все опасные теги (точнее, отфильтрую все, а потом разрешу безопасные), попросту сажаю текст в контейнер из таблицы: <table><tr><td>...</td></tr></table>. Любой недозакрытый тег внутри таблицы закрывается при выходе из неё. Это, насколько я знаю, самый простой вариант борьбы с непарными тегами.

> За рег - спасибо. Осталось только разобраться, как он работает... Начало и конец паттерна для меня - загадка...

Да там просто же всё. Обычный перловый рег. Ещё можно \b поставить вначале для верности.

{((?:(?:https?|ftp)://|www\.)\S+)(?<![.,:;!?\)\<-])}

Можно переписать как:
{((?:https?://|ftp://|www\.)\S+)(?<![.,:;!?\)\<-])}

Ссылка может начинаться с "https?://|ftp://|www.", за которым идёт какое-то количество не-пробелов (\S+). Но последний из этих непробелов не должен совпадать с определённым набором символов: (?<![...]). А именно, с ".,:;!?\)\<-" (чисто эмпирический набор). Это для того, чтобы можно было после ссылки ставить точку, запятую и т.д.

> Вот исходники: http://ronet.ru/gb.zip

Спасибо, погляжу:)

Profile

romikchef: (Default)
(P) All pun intended

January 2026

S M T W T F S
    1 23
45678910
11121314151617
18192021222324
25262728293031

Style Credit

Page generated Jan. 12th, 2026 03:27 am
Powered by Dreamwidth Studios

Expand Cut Tags

No cut tags