Autor Zpráva
_fantomas
Profil
Ahoj, na webe mám ShoutBox celkom obyčajný v PHP cez MySQL no mám problém s tím že uživatelia môžu do chatu dávať
HTML tagy vlastne všetko, môžu dokonca aj zmeniť velkost chatu napíšu si tam svoje divy a je to cele v háji.
Proste potrebujem zakázať všetko čo by mohlo uškodiť alebo zmeniť chat, chcem len aby šlo klasické pisanie
zakázať tagy. Hladal som po googlu no neuspešne viete mi niekto poradiť?
juriad
Profil
Při výpise použij funkci htmlspecialchars.

echo htmlspecialchars('<div onclick="alert(\'Baf!\');"></div>')
Alphard
Profil
Nebo ty tagy rovnou vyhazovat pomocí strip_tags(), pozor, jestli použijete druhý parametr a nějaké tagy povolíte, nebudou ošetřeny jejich parametry :-( Pak je lepší použít nějakou knihovnu jako Texy! nebo HTML Purifier. Ty jsou však poměrně složité, proto se to často řeší smazáním všech tagů a převodem povoleného white-listu (např. BB kódy) na html tagy.
_fantomas
Profil
V PHP som aky taky začiatočník, to čo si napísal ty akože robí čo?
Tu mám ten skript a akosi neviem kam to mám hodiť a čo vlastne znamená alebo čo zablokuje to čo si napísal ty ?!

<?php
if($_SESSION['prihlaseny']){
?>

<?
if($_SERVER['REQUEST_METHOD'] == "POST" && !empty($_POST['s-obsah'])){

$server = "*****"; 
$login = "*****"; 
$heslo = "*****"; 
$databaza = "*****";
$mysql = new mysqli("$server", "$login", "$heslo", "$databaza");
 if ($mysqlXw->connect_errno) {echo"chyba pripojienia";}
  else{
   header("Location: #");
   $query = "INSERT INTO `shoutbox` (`autor` ,`text`) VALUES ('".$_SESSION['prihlaseny']."', '".$_POST['s-obsah']."');"; 
   $res = mysqli_query($mysql, $query);
   $mysql->close();}
}   
?>

<div class="nazov-widget">
<h3><i class="icon-comments-alt "></i> ShoutBox</h3>
</div>
<div class="widget">
<div class="shout-box-message-blok">
<?php

$articles = mysql_query("SELECT * FROM shoutbox ORDER BY datum DESC LIMIT 30");
while($row = mysql_fetch_assoc($articles)){
?>
<div class="shout-box-message">
<p>
<span style="font-size: 9px;"><?echo $row['id']?># </span><span style="color: #1991DB; font-weight: bold;"><?echo $row['autor']?> :</span>
<?echo $row['text']?>
</p>
</div>
<?
}
?>
</div>

<form action="" method="POST">
<textarea style="height:60px; width:250px; margin-top: 10px;" placeholder="Text správy..." class="textbox" name="s-obsah"></textarea><br />
<input type="submit" class="default" style="padding: 0px; width:30%;" value="Odoslať">
</form>
</div>
   

<?
} else {
?>



<div class="nazov-widget">
<h3><i class="icon-comments-alt "></i> ShoutBox</h3>
</div>
<div class="widget">
<div class="shout-box-message-blok">
<?php

$articles = mysql_query("SELECT * FROM shoutbox ORDER BY datum DESC LIMIT 30");
while($row = mysql_fetch_assoc($articles)){?>
<div class="shout-box-message">
<p>
<span style="font-size: 9px;"><?echo $row['id']?># </span><span style="color: #1991DB; font-weight: bold;"><?echo $row['autor']?> :</span>
<?echo $row['text']?>
</p>
</div>
<?
}
?>
</div>
<p style="text-align: center;">Pre písanie do chatu sa musíš prihlásiť</p>
</div>
<?
}
?>
juriad
Profil
35. a 68. řádku změň na:
<?php echo funkce($row['text']); ?>
Podobnou úpravu proveď u autora (přece nechceš, aby zobáček < ve jméně způsobil ten samý problém).

To, kterou funkci (htmlspecialchars, strip_tags, něco svého) zvolíš je na tobě.
_fantomas
Profil
Meno sa doplne samo s ktorým je prihlásený a u registračného formulara to mám ochránené tie < >
takže ak som správne pochopil má to byť napríklad takto?

<?php echo strip_tags($row['text']); ?>
juriad
Profil
Ano. A kdyby sis to vyzkoušel, už bys to dávno zjistil :)
_fantomas
Profil
Dík to by bolo vyriešené a čo PHP tagy?
Som napísal do Spravy echo "Ahoj"; a
to sa mi síce v chatu nezobrazuje ukáže sa len NICK a ID spárva je prázdná ale v tabulke sa to zapisuje
<?php
echo "Ahoj";
?>

Je to v poriadku? nemôže to byť škodlivé?
juriad
Profil
To je v pohodě. Strip_tags zahodí vše od počáteční závorky < až po koncovou >.
Pokud to necheš ani ukládat do databáze, tak uprav INSERT:
$query = "INSERT INTO `shoutbox` (`autor` ,`text`) VALUES ('".$_SESSION['prihlaseny']."', '".strip_tags($_POST['s-obsah'])."');";
Mimochodem, máš to děravé, všechny vstupy do databáze bys měl prohnat funkcí mysql_real_escape_string.
_fantomas
Profil
V tom prípade problém vyriešený, Dík :)
Jan Tvrdík
Profil
Alphard:
Ach jo, proč mu prosím tě radíš strip_tags, která se pro to vůbec nehodí? Použití té funkce mu přidá víc problémů, než vyřeší.

juriad:
To, kterou funkci (htmlspecialchars, strip_tags, něco svého) zvolíš je na tobě.
To není pravda, i když se rozhodne udělat chybu a použít strip_tags, tak musí stejně její výstup prohnat přes htmlspecialchars, neboť funkce strip_tags obecně nevrací validní HTML. Varianta „něco svého“ je ještě horší než strip_tags. To už si ho rovnou mohl střelit do nohy, ne?
Alphard
Profil
Jan Tvrdík [#11]:
Protože informuji o dalších relevantních věcech, viz zbytek mého příspěvku. Chce se zbavit tagů, takže strip_tags() rozhodně relevantní je, některé problémy jsou zmíněny v komentářích v manuálu, který jsem mu odkázal, další může dohledat s tímto klíčovým slovem; a navíc nikde netvrdím, aby nepoužíval nic dalšího (htmlspecialchars() uvedl už juriad).
Obecně lze říci, že podstatou vzdělání je informace sdílet, takhle již ví, jakým směrem se vydat, když bude chtít povolit tučné písmo.
Jan Tvrdík
Profil
Alphard:
Chce se zbavit tagů
Nechce se zbavit tagů. On má problém s tím, že tam má XSS, a protože tomu nerozumí, tak se mylně domnívá, že se potřebuje zbavit tagů. Kromě toho ty tvrdíš „Nebo ty tagy rovnou vyhazovat“, čímž silně naznačuješ, že lze použít htmlspecialchars nebo strip_tags, což není pravda, neboť potřebuje vždy htmlspecialchars a pokud se dobrovolně rozhodne rozbíjet uživatelům příspěvky, smajlíky a podobné bizarní konstrukce, tak tam může přidat navíc strip_tags.


Pro ilustraci, co myslím tím rozbíjením příspěvků – pokud něco do chatu napíše "I <3 you, Daisy!", tak po použití funkce strip_tags z té zprávy zbude jenom "I".
_fantomas
Profil
Takže čo mám použiť aby tam nefungovali tagy, aby nemohli ovplyvniť chat, nemohli meniť veľkosť pridávať tučné písma ..? :/
juriad
Profil
Použij htmlspecialchars a dej vědět, jestli se to chová přesně, jak chceš. Pokud bys chtěl něco speciálního, tak se to musí udělat složitěji pomocí několika funkcí.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: