HTML тагове в PHP

amgcompany

Registered
Здравейте,

Имам една HTML форма която като я попълня и ми вкарва инфо в БД. Как мога да направя така че да мога да използвам HTML тагове но да предотвратя XSS атаки от сорта

<script>alert("SPAM")</script>

Но тагове като <p>,<br/>,<b> да работят. С htmlspecialchars не става, чудя се дали има някакви начини с регулярни изрази ама не мога да измисля нищо.
 

eddyy93

Registered
PHP:
$string='texta_koito_shte_vadish';

$string = str_replace("<b>", "[b]", $string);
$string = str_replace("</b>", "[/b]", $string);
$string = str_replace("<p>", "[p]", $string);
$string = str_replace("</p>", "[/p]", $string);
$string = str_replace("</br>", "[/br]", $string);
$string = str_replace("</br>", "[/br]", $string);

echo $string;

Така ги вкарваш в базата данни и после като ги изкарваш:


PHP:
$string=$row['text'];

$string = str_replace("[b]", "<b>", $string);
$string = str_replace("[/b]", "</b>", $string);
$string = str_replace("[p]", "<p>", $string);
$string = str_replace("[/p]", "</p>", $string);
$string = str_replace("[/br]", "</br>", $string);
$string = str_replace("[/br]", "</br>", $string);

echo $string;


ЕДИТ:

[ b] НЕ ИЗЛИЗА ТЪЙ КАТО ТУК ФОРУМА ГО ЧЕТЕ КАТО ТАГ. НО ТИ ЩЕ СИ ГО ЗАМЕСТИШ ПРИ ТЕБ ПРАВИЛНО - ТРЯБВА ДА Е [ b] И ЗАТВАРЯЩ [ /b] БЕЗ ПРАЗНИТЕ МЕСТА ПРЕД БУКВАТА.
 

eddyy93

Registered
PHP:
$string='tova e tekst <b> koito ima bold </b> tag v nego';

$string = str_replace("<b>", "[ b]", $string);

$string = str_replace("</b>", "[ /b]", $string);

$string = str_replace("<p>", "[p]", $string);

$string = str_replace("</p>", "[/p]", $string);

$string = str_replace("</br>", "[/br]", $string);

$string = str_replace("</br>", "[/br]", $string);

$string = htmlspecialchars($string);

echo $string; // това е ти стринг който ще вкарваш в базата ти данни

-------------------------

ТОВА ТИ Е СТРИНГА КОГАТО ГО ИЗКАРВАШ

PHP:
$row=mysql_query("zaqvkata_ti");
while($rowcheto=mysql_fetch_assoc($row)){

$string=$rowcheto['tekst'];

$string = str_replace("[ b]", "<b>", $string);

$string = str_replace("[ /b]", "</b>", $string);

$string = str_replace("[p]", "<p>", $string);

$string = str_replace("[/p]", "</p>", $string);

$string = str_replace("[/br]", "</br>", $string);

$string = str_replace("[/br]", "</br>", $string);

echo $string;
}
 

M1tq96

Registered
ти пак си слагай , htmlspecialchars , просто при изкарването слагай stripcslashes , така ще се оттървеш от ескейпнатите наклонени черти и други такива знаци .. :)
 

eddyy93

Registered
M1tq96 каза:
ти пак си слагай , htmlspecialchars , просто при изкарването слагай stripcslashes , така ще се оттървеш от ескейпнатите наклонени черти и други такива знаци .. :)

Не stripcslashes ами stripslashes, stripcslashes са по-различни
 

relax4o

Registered
Виж втория параметър на тази функция: strip_tags(). Във втория параметър се задават таговете, които са позволени(т.е. да не бъдат премахнат).

PHP:
// Allow <p> and <a>
echo strip_tags($text, '<p><a>');
 

amgcompany

Registered
relax4o каза:
Виж втория параметър на тази функция: strip_tags(). Във втория параметър се задават таговете, които са позволени(т.е. да не бъдат премахнат).

PHP:
// Allow <p> and <a>
echo strip_tags($text, '<p><a>');
начина е бърз и лесен, не знам дали е от най-надеждните но не работи ако преди това съм сложил htmlspecialchars
 

tedo96

Registered
amgcompany каза:
relax4o каза:
Виж втория параметър на тази функция: strip_tags(). Във втория параметър се задават таговете, които са позволени(т.е. да не бъдат премахнат).

PHP:
// Allow <p> and <a>
echo strip_tags($text, '<p><a>');
начина е бърз и лесен, не знам дали е от най-надеждните но не работи ако преди това съм сложил htmlspecialchars
Нормално да не работи... Прочети какво правят двете функции. Когато работиш с strip_tags() няма смисъл от htmlspecialchars().
 

relax4o

Registered
Ами вие бухате по 2289147397 функции УЖ да се защитите. Имат си подробно описание всяка функция какво прави.
Ти като променяш с htmlspecialchars как очакваш да ти работи strip_tags() като тя вече не вижда тагове, а някакви си знаци само.
 

amgcompany

Registered
relax4o каза:
Ами вие бухате по 2289147397 функции УЖ да се защитите. Имат си подробно описание всяка функция какво прави.
Ти като променяш с htmlspecialchars как очакваш да ти работи strip_tags() като тя вече не вижда тагове, а някакви си знаци само.

Еми не съм толкова компетентен и заради това. Иначе благодаря на relax4o +1 :)
 

eddyy93

Registered
Между другото пак могът XSS да ти вкарат. : ))

Примерно bold тага:


PHP:
$text='<b>text</b>';
$text=strip_tags($text, '<b></b>');

echo $text;

//Тук ти се появява един нормален болднат стринг

НО:

PHP:
$text='<b>text';
$text=strip_tags($text, '<b></b>');

echo $text;

//Тук ти се появява цялата страница болдната от началото на стринга

За това, че трябва да правиш проверка да бройш <b> таговете и ако не отговярят на </b> тогава най-накрая на текста да го затвори автоматично.


------------------------------------


Или просто винаги на края на техта дори и да няма таговете да си ги затваря.

Пример:


PHP:
$text=$row['text']."</b></p></i>";

//но това не е добър вариянт, защото някой може да напише два пъти <b><b> и отново да му стане xss то

//за това го прави по-горният начин като ги броиш
 

relax4o

Registered
И какво като bold-не текста ? Само този, който го направи ще му се удебели текста.
@eddyy93 сигурен ли си, че знаеш значението на XSS ?
 

eddyy93

Registered
Абе нали този текст се вкарва в базата данни. Следователно на всички ще се болдне този текст заедно с полувината сайт. Само съм дал пример в миналия пост.
 

relax4o

Registered
Аз не прочетох, че ще влиза в база данни.

Ако ще вкарва в база данни, подхода да вкарва чист HTML е много погрешен. По-добре да ползва някоя bbcode система.
 

Горе