LINUX.ORG.RU

Реализация bb-тега url на php

 ,


0

1

Задача: пользователь пишет в окошко текст, внезапно на него находит желание поставить ссылочку на ЛОР, пользователь не дурак и сходу [ url=http://linux.org.ru ] годный сайт [ /url ] (без пробелов, разумеется). При сохранении этого дела в бд, соответствующий скрипт заменяет все спецсимволы на их HTML-представление, далее, при отображении..

Реализация: очевидная реализация — регэкспы (я в них дно, как положено, но в гугл меня пускают пока, сделал)

$res = preg_replace("#\[url=(.+?)\](.+?)\[\&\#47\;url\]#isU",
			'<script type="text/javascript">document.write(\'<a href="\\1">\\2</a>\');</script>', $res);

Немного поясню: скрипт заменяет bb-код не на HTML-код вида

<a href="http://linux.org.ru">годный сайт</a>

а на JavaScript-код, который, в свою очередь, выводит с помощью document.write() уже HTML-код. Это сделано в целях гнустного SEO.

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

Думаю, тут проблема в кривом регэкспе, но сам разобраться не смог. Эни айдиас?

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

во первых у тебя в сабже дохрена дыр для XSS

во вторых режексп:

\[url=([^\]]+?)\]([^\[]+?)\[\/url\]

обрати внимание что вместо '.' стало '[^\[]' - про экранирование слешем '[' в этом вашем php я не знаю поэтому обрати внимание на сей нюанс, может достаточно '[^[]'

ps. конченный лоровский движек портит код, там не ]]] а ]]

Deleted
()
Последнее исправление: Deleted (всего исправлений: 3)
Ответ на: комментарий от Deleted

в сабже дохрена дыр для XSS

Это потому что я их внутрь JavaScript'a пускаю? Ясно, поборю, ОГРОМНОЕ спасибо за это замечание. Больше по этому вопросу ничего не упускаю?

вместо '.' стало '[^\[]'

Поясни, если не сложно, в двух словах, что ты исправил? (.+?) — это, если я правильно понимаю, любой символ плюс любая длина. А у тебя?

pihter ★★★★★
() автор топика
Ответ на: комментарий от pihter

Это потому что я их внутрь JavaScript'a пускаю?

нетолько, потому что не эскейпишь всякую хрень которую могут заслать юзеры, почитай про XSS

Поясни, если не сложно, в двух словах, что ты исправил? (.+?) — это, если я правильно понимаю, любой символ плюс любая длина. А у тебя?

любой символ кроме тех что идут после ^ - в данном случае ] и [ - слеш ка я писал должен экранировать, но это надо читать документацию

Deleted
()
Ответ на: комментарий от Deleted

и да, '+?' - это херня, надо либо '*' - по поведению тоже любая длина (0…inf) либо + это (1…inf)

а то если кто увидит то покроется фейспальмами

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

потому что не эскейпишь всякую хрень которую могут заслать юзеры

Эскейплю же! В шапке писал...

почитай про XSS

К стыду своему, вообще такого термина не знал, после твоего поста заглянул на Вику, трохи-трохи прозрел, еще раз спасибо, кстати, совет твой тоже помог, плюсик те в карму и да не отсохнет во веки рука, которой ты сей пост клепал! :)

pihter ★★★★★
() автор топика
Ответ на: комментарий от pihter


Эскейплю же! В шапке писал...

ну вот чисто гадая по коду я могу попробовать вставить

[url=http://blah.com]');alert('cooke!');document.write('[/url]

- скорее всего сработает

если будет доступ к страничке то можно еще что-то придумать (я взломом ни разу не занимался, но в силу профессии приходится изучать, потому накидать рабочий код вот так не смогу)

дальше надо копать что и как там эскейпится, а то на лоре в 2013 году народ случайно запостил ссылку, я смотрю а это путь для xss, на следующий день только достучался до администрации чтобы пофиксили

Deleted
()

А почему бы сразу на клиенте замены не сделать?


"foo[url=https://linux.org.ru]cool site[/url]foo[url=http://linux.org.ru]cool site[/url]foo"


.replace(/\[[^\]]+\][^\]]+\]/g, function(x){

  return x.replace(/\[/g, "<")
    .replace(/\]/g, ">")
    .replace(/\/url/gi, "/a")
    .replace(/url\s*=/gi, "a href=")
    .replace(/(https?:\/\/[^>]+)>/gi, "'$1'>")
    .replace(/<[^>]+>[^>]+>/gi, '<script>document.write("$&")</script>')

})



//>>>> foo<script>document.write("<a href='https://linux.org.ru'>cool site</a>")</script>foo<script>document.write("<a href='http://linux.org.ru'>cool site</a>")</script>foo

типо того. PHP не знаю:)

kotlov-net
()

А чего б не воспользоваться готовой качественной библиотекой, чем изобретать велосипеды?

anonymous
()
Ответ на: комментарий от anonymous

This. Вангую «Мне нужна только это функциональность - зачем мне тянуть стороннюю БИБЛИОТЕКУ, я лучше активных xss понапихаю с кучей сложно поддерживаемых регулярок».

anonymous
()
Ответ на: комментарий от anonymous

с кучей сложно поддерживаемых регулярок

эта попаболь от неумениия структурировать код.

anonymous
()
Ответ на: комментарий от anonymous

Ну, не знаю. Я более менее норм разбираюсь в них, но мне кажется, что использование их на постоянной основе плохим тоном, те. по-быстрому что-то достать, прочитать для себя, статистики, сбора информации - ok.
А использовать их во всяких парсерах и на постоянной основне - !ok.
Не просто так в perl6 сделали упор на грамматики.

anonymous
()
Ответ на: комментарий от Deleted

- скорее всего сработает

Не сработало: отработало корректно (это уже в твоем варианте)

pihter ★★★★★
() автор топика
Ответ на: комментарий от risenshnobel

Ставь на ссылки nofollow и не выделывайся с js

была утка где-то глубоко в моей голове, что гугляндексы могут лишь делать вид, что не учитывают ноуфоллоу, а в то что не парсят(и не станут парсить) js-код я пока свято верю.

смысл есть, канеш, в твоих словах, но я решил сразу сделать вот так, не видел опасностей в этом

pihter ★★★★★
() автор топика
Ответ на: комментарий от pihter

я сразу написал что может не сработать, если хочется веселья показывай страничку - анонимус проверит на узявимости

Deleted
()
Ответ на: комментарий от kotlov-net

А почему бы сразу на клиенте замены не сделать?

До отправки или при показе?

Если до отправки, то плохие дяди могут локально модифицировать js-скрипт и скормить серверу все что хотят, обойдя.

Если при показе — то без защиты оставляем сервер.

pihter ★★★★★
() автор топика
Ответ на: комментарий от Deleted

ТС, послушай этого человека

Я эту мысль сам себе сказал более раньше. И даже послушал, но интересно же было, будут ли отличия — сделал опционально и так и так.

не плоди ужасы.

Уже и в своей песочнице не дают извращаться :)

pihter ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Используй markdown, Люк!

Не слыхал про такой, Магистр, однако, погуглив, проникся. Никто не мешает скрестить бобра с ослом. Но идеи маркдауна мне нравятся более сильнее. биби хорош тем, что его все так и так умеют, однако большое спасибо за это замечание

pihter ★★★★★
() автор топика
Ответ на: комментарий от anonymous

А чего б не воспользоваться готовой качественной библиотекой

Эдак и свою движок можно было бы и не начинать. Да и не программировать вообще: все ж уже написано — бери да пользуй.

Причина проста: я хотел сделать так, как нужно именно мне, да и сделать нужно не реализацию bb-кода, а реализацию некоего pihter-кода, который немного пересекается с bb. Можно было взять готовую и перепислить, но не из-за трех же bb-кодов. Кроме того, ИМХО, хороший повод трохи покурить регекспы. Это всяко полезнее

pihter ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Не сработает.

Не сработал. Отработало как часики

pihter ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Вангую «Мне нужна только это функциональность - зачем мне тянуть стороннюю БИБЛИОТЕКУ

Верно вангуешь.

я лучше активных xss понапихаю с кучей сложно поддерживаемых регулярок

Конечно лучше. Вашей логикой, господа, можно и не писать функцию обработки дерева у ся на сайте, а подтянуть готовую библиотеку, не писать функцию вычисления факториала, а подтянуть готовую библиотеку!

Для справки: у меня там из bb только b b u u s s i i url url ты правда считаешь, что для их реализации не стоит использовать регулярки, а стоит подтащить какую-либо библиотеку?

pihter ★★★★★
() автор топика
Ответ на: комментарий от Deleted

я сразу написал что может не сработать

А никто тебя в этом не упрекает. Я спросил помощи, ты — помог. Честь, хвала и уважуха. Глумление с моей стороны было бы не уважением к твоему желанию помочь бескорыстно, это ж какой свиньей надо быть.

если хочется веселья показывай страничку - анонимус проверит на узявимости

Это я зассу, пожалуй :) там логин и пароль — админ-админ, анон меня в щепки разнесет :)

А вообще, когда подрастет до состояния стояния, почему бы и нет. Сделаю тестовую, пусть анон повеселиться, да и мне польза, если анон попадется порядочный.

pihter ★★★★★
() автор топика
Ответ на: комментарий от pihter

гугляндексы могут лишь делать вид, что не учитывают ноуфоллоу

Могут, и, возможно, делают, но

а в то что не парсят(и не станут парсить) js-код я пока свято верю.

http://googlewebmastercentral.blogspot.fr/2014/05/understanding-web-pages-bet...

In order to solve this problem, we decided to try to understand pages by executing JavaScript. It’s hard to do that at the scale of the current web, but we decided that it’s worth it. We have been gradually improving how we do this for some time. In the past few months, our indexing system has been rendering a substantial number of web pages more like an average user’s browser with JavaScript turned on.

Так что не стоит из-за СЕО жертвовать здравым смыслом, имхо. Ссылка с nofollow - общепринятый метод, а вот твоё решение слишком костыльное, и делать так стоит только если действительно нет других способов.

risenshnobel ★★★
()
Ответ на: комментарий от risenshnobel

Гугл давно это делает. Я еще года 3 назад проверял, в гугле комментарии с youtube проиндексированы. Но яндекс, вроде, пока не может.

А вот интересно, если сделать ссылку через ajax, типа, на клик вешаем ajax-запрос, на который приходит скрипт с редиректом, пойдет он по этой ссылке?

anonymous
()
Ответ на: комментарий от risenshnobel

In order to solve this problem

Щьёрт побьяри!

Так что не стоит из-за СЕО жертвовать здравым смыслом, имхо

Соглашусь, пожалуй, глупость затеял

Ссылка с nofollow - общепринятый метод, а вот твоё решение слишком костыльное, и делать так стоит только если действительно нет других способов.

Убедил. Подписываюсь.

pihter ★★★★★
() автор топика
Ответ на: комментарий от anonymous

А вот интересно, если сделать ссылку через ajax, типа, на клик вешаем ajax-запрос, на который приходит скрипт с редиректом, пойдет он по этой ссылке?

Да нет, конечно. Он и по жабаскриптам, пока, не ходит. Ну, мож, вид делает. Но дело это решаемое.

pihter ★★★★★
() автор топика
Ответ на: комментарий от codekeeper

Что мешает посмотреть реализацию в готовых движках?

Ничто. Просто нахрена смотреть реализацию функции факториала в готовых движках, если я и сам могу: она довольна очевидна. Тут не мега-задача какого-нибудь распознавания текста или речи, тут, задачка-то никакая. Просто я где-то затупил и спросил помощи на форуме (а иначе, зачем этот форум?) знающие камрады с первого взгляда ткнули мордой, обогатился опытом, узнал пару фактов, камрады осознали свою значимость, всяк, кто нагуглит это в будущем — тоже обогатится, ЛОР получит прибыль с рекламы, какую-никакую, гугл получит рекламную аудиторию — все счастливы, экономику двигаю, епт :)

pihter ★★★★★
() автор топика
Ответ на: комментарий от Deleted

обрати внимание что вместо '.' стало '[^\[]' - про экранирование слешем

а почему плюс нежадный? Используй жадный, он быстрее.

emulek
()
Ответ на: комментарий от pihter

Ничто. Просто нахрена смотреть реализацию функции факториала в готовых движках, если я и сам могу: она довольна очевидна.

Правда? А я вот сомневаюсь, что для данной реализации нужно использовать жадные регулярки в свете очевидных альтернатив.

codekeeper
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.