news.bg bug – или за какво трябва особено да внимавате, като правите собствен маркъп

June 27, 2006

Първо ефекта, после причините и накрая – за онези от вас, които програмират такива системи – обяснението.

Ефект:

Причини:
Ако искате да скапете news.bg можете в коментарите към постовете да пускате огромно количество smiley.

Обяснение:
Представете си, че имате текстово поле, в което не искате да има повече от, да речем, 512 символа или голямо варчар поле. Ако юзърът ви постне 700 символа, правите един substr / mid и бутате 512 символа в базата (или не го правите и базата сама го прави / или почва да бие грешки, в зависимост от настройката).

Ако имате маркъп от вида [img src=mysmiley.png] и съхранявате в базата крайния резултат – <img src=mysmiley.png>, тогава е възможно точно на края на 512-тия символ картинката да се прекъсне, тагът да остане отворен и да намаже кода, както става в news.bg.

Решения, които ми хрумват, по ред на неизползваемост:
a/ да не се ползва такъв маркъп 🙂 (кофти)
b/ да се ползва, но да се съхраняват както са си [img …] (пак кофти, защото накрая на някои постове ще увисват [img src=mysml, + това е бавно)
c/ да се оставят запасни символи – примерно да се реже до 500-тния символ
d/ да се направи regexp за проверка, дали това не се е случило
e/ да се подсигури, че се прави изобщо substr, а не се разчита на възможността SQL-а да реже стринга.

Успех ;-P

Публикувано в: Грешки 6 коментара RSS 2.0

Ако постът ви харесва, цъкнете на сърцето:

Коментари

6 коментара на “news.bg bug – или за какво трябва особено да внимавате, като правите собствен маркъп”

  1. Илия Горанов [Бабата] on June 28th, 2006 09:31

    Само да попитам – нали имаш някакъв regexp, който намира […] и го прави на <…>

    Ако пуснеш тая работа след отразването и имаш картинка, която е срязана, тя просто няма да стане на <… и ще остане […

    Това е елементарно решение, което няма да ти забави, дори ще ускори скрипта, защото няма да подменяш код за картинки, който след това ще отрежеш!

    Естествено има страничен ефект – има риск текстът да завършва с някакъв BB код накрая! Ама и това се чисти с друг RegExp.

    А скаш ли да ти кажа какво се казва bug за милиони. Търсихме го двама души два дни!

    Имам скрипт със сесия, който дропва сесията, когато POST е с нулева дължина (т.е. когато отваряш страницата като адрес, а не чрез submit на форма).

    Скриптът работи самостоятелно. Работи във всички браузъри и на 5 различни сървъра. След това вкарвам резултата от работата на скрипта в шаблона на страницата и той спира да работи. Спира да работи във всички браузъри и на 5те различни сървъра. Т.е. проблемът не е нито в настройките на браузъра, нито в настройките на сървъра. В шаблона имам чист HTML, нямам 1 ред PHP. Кода на моя скрипт е преди шаблона (т.е. няма начин да има нещо пуснато преди моя скрипт да прати HTTP хедърите) Обаче след втория submit сесията се drop-ва?

    Ха познай от къде идва проблема? Първия ден се пробвахме да мислим логически и да търсим проблемното място – не стана…

    Втория ден седнах и взех да трия кода от шаблона ред по ред и след всеки изтрит ред проверявам, дали работи или не. Накрая изтривам една картинка от HTML-а и кода започва да работи!

    Ха сега познай каква е причината. Ако не се сетиш, ще ти кажа утре 🙂

  2. Илия Горанов [Бабата] on June 28th, 2006 09:32

    пфу, горе не ми излязоха счупените скоби, трябваше да използвам ентитита, ама кой да се сети 🙂

  3. dzver on June 28th, 2006 10:53

    Емиии, може да си сбъркал пътя на картинката по начин, така че да се обръща към index.php? По този начин обръщението ще е GET и ще дропи сесията наново.

    Само дето не ми хрумва удачна грешка, с която това да става.

    Примерно трябва да е нещо такова:
    <img src=. pic.jpg>
    <img src=/ pic.jpg>
    <img src=?pic.jpg>

  4. dzver on June 28th, 2006 11:19

    btw 1 сложих това, което предположих, че strip_tags е изяло
    btw 2 ICQ#30194509 🙂

  5. Илия Горанов [Бабата] on June 28th, 2006 23:16

    Хе хе… Близо беше. Т.е. уцели го, ама адреса на картинката не позна 🙂

    Ама сега е лесно, защото аз обясних причината, а когато го дебъгвах, не знаех точната причина, разбрах я чак в последствие. То намирането на грешката беше едната работа. След това търсих как може тъпата картинка да ми влияе на работата на скрипта.

    А цялата далавера беше, че картинката е мястото за банер в дизайна. И дизайнерът оставил дупка, оставил код за картинка в шаблона, ама понеже предварително нямал банер, оставил src=”#” както линковете, които не водят на никъде ги оставят href=”#” и дебъгвай два дни като идиот… А най-тъжното е, че ако бях започнал дебъга след връзването на банер ротатора, нямаше и да го видя!

  6. Илия Горанов [Бабата] on June 28th, 2006 23:17

    btw:
    ICQ 151539721
    gtalk: babailiica@gmail.com
    skype: Babailiica

Оставете отговор