Autor Zpráva
Nookyn
Profil
Zdarec, udělal jsem si návštěvní knihu zde. Ale pořád mam jeden a ten samej problém, HTML je povolené i tam mam funkci htmlspecialchars. Help me pls



<h1>Návštěvní kniha</h1>

<hr>

<?php
//databáze, skript pro upravení
$datum = StrFTime("%d/%m/%Y %H:%M:%S", Time());
$ip = $_SERVER["REMOTE_ADDR"];

//pokud je zmáčknuto tlačítko Přidat
if (isset($_POST['pridat']))
   {
   //vybereme nejvetěí ID
   $ID=mysql_query("SELECT ID FROM kniha ORDER BY ID DESC LIMIT 1");
   $ID=mysql_fetch_array($ID);
   
   //nové ID je o jedna větší než to největší současné
   $ID=$ID['ID']+1;
   
   //ošetříme data
    $nick = htmlspecialchars($nick);
    $text = htmlspecialchars($text);
    $text = nl2br($text); 
	
    $nick=mysql_real_escape_string($_POST['nick']);
    $text=mysql_real_escape_string($_POST['text']);
    $datum=mysql_real_escape_string($_POST['datum']);
    $ip=mysql_real_escape_string($_POST['ip']);
   
    mysql_query("INSERT INTO kniha (ID,nick,text,datum,ip) VALUES
   ('$ID','$nick','$text','$datum','$ip')");
    }
echo("<table><form method='post'>");
echo("<tr><td><input type='hidden' name='ip' value='$ip'></td></tr>");
echo("<tr><td><input type='hidden' name='datum' value='$datum'></td></tr>");
echo("<tr><td><b><span style='font-size: 12px;'>Nick:</span></b> </td><td><input type='text' name='nick' maxlength = '50'></td></tr>");
echo("<tr><td></td><td><textarea name='text' rows ='5' cols='75'></textarea></td></tr>");
echo("</table>");
echo("<input type='submit' name='pridat' value='Přidat příspěvek'>");
echo("</form>");

?> 

<br><br><br><br>

<table>
<?php
echo(stripslashes($Vypis));
$clanky = mysql_query('SELECT * FROM `kniha`');
$vysled = mysql_fetch_array($Vyber);

$Vyber = mysql_query('SELECT * FROM `kniha` ORDER BY ID DESC LIMIT 10');

while ($Vypis = mysql_fetch_array($Vyber)){
    $Vypis["text"] = stripslashes($Vypis["text"]);
	$Vypis["nick"] = stripslashes($Vypis["nick"]);
    echo("
<tr>
<td><span style='color: #0067a9; font-weight: bold; font-size: 15'>".$Vypis['nick']."</span>&nbsp;&nbsp;&nbsp;&nbsp;".$Vypis['datum']."&nbsp;&nbsp;&nbsp;&nbsp;".$Vypis['ip']."</td>
</tr>
<tr>
<td>".$Vypis['text']."</td>
</tr>
    ");
}
?>
</table>
denCo
Profil
ta funkcia ti nechcene znaky zameni za entity, napr. znak < ti premenny za &lt; ... ale zobrazi ti to ako keby napises obycajne <
Nookyn
Profil
Ale já potřebuji vědět jak ten problém odstranim :-D, prostě potřebuji proměnit znaky za entity! :-(
Jan Tvrdík
Profil
//ošetříme data
    $nick = htmlspecialchars($nick);
    $text = htmlspecialchars($text);
    $text = nl2br($text); 
    
    $nick=mysql_real_escape_string($nick); // vyhozeno $_POST
    $text=mysql_real_escape_string($text); // tady taky
    $datum=mysql_real_escape_string($_POST['datum']);
    $ip=mysql_real_escape_string($_POST['ip']);
Alphard
Profil
Nookyn:
Jste si jist, že chcete přenášet ip a datum v hidden inputu? Tohle jde lehce podvrhnout.
A ten váš neatomický výpočet id na tři řádky by šel elegantně řešit s auto_increment.
Nookyn
Profil
Jane, podle toho co jsi sem dal to nejde...
Alphard
Profil
Nookyn:
Jane, podle toho co jsi sem dal to nejde...
Buďte konkrétnější, jak nejde? Na 21. řádku je první výskyt $nick, takže by mělo být $_POST['nick'] a dále analogicky.
tiso
Profil
Nookyn: a tvoj problém je aký? Nepochopil som to z tvojho popisu ani z tvojho kódu.
AM_
Profil
Tohle je strašné,
-jak píše Alphard, přenášení IP a datumu přes formulář mě děsí - proč to přenášet, když to lze zjistit rovnou v PHP?
-na řádku 48 vypisuješ proměnou Vypis, která ještě není založená
-kde bereš proměnnou $nick a $text? viz řádek 21-28 - stejně ji přepíšeš hodnotami z $_POST
proto to zřejmě nefunguje - htmlspecialchars voláš na ještě nezaložené proměnné, takže nemají žádný vliv a ještě budou vyhazovat notice
-vzhledem k tomu, že máš zřejmě zaplé magic_quotes_gpc, nemusíš vůbec volat mysql_real_escape_string a následně po vytažení z databáze stripslashes
-zajímalo by mě, proč kus HTML vypíšeš pomocí echo, pak ukončíš PHP blok a další HTML kód vypisuješ mimo něj - vypisoval bych vše mimo, ale hlavně to sjednotit
denCo
Profil
Ale já potřebuji vědět jak ten problém odstranim :-D, prostě potřebuji proměnit znaky za entity! :-(
to je kravina, co ked niekto chce napisat 3 < 5 ??? alebo jednoducho ak ti tak velmi na tom zalezi tak pouzi funkciu ktora ti zameni nejaky znak za iny znak
SwimX
Profil
denCo:
to je kravina, co ked niekto chce napisat 3 < 5 ???
no tak se do DB uloži 3 &lt; 5 a při výpisu si to prohlíeč převede a zobrazí 3 < 5 vždyť je to dobře, a je dobře že to dělá, jinak by mu tam někdo vložil "nebezpečný kód"
<script>while(true)alert('a');</script>
a pěkně děkuju :)

alebo jednoducho ak ti tak velmi na tom zalezi tak pouzi funkciu ktora ti zameni nejaky znak za iny znak
a proč by vypisoval
str_replace(array(">", "<", ...), array("&lt;", "&gt;", ...));
když to jde tak snadno, přímo na to určenou fcí?

Přemýšlej než napíšeš takovou blbost s tolika otazníky.
AM_
Profil
denCo, SwimX:
tazatel se akorat poradne nevyjadril, jeho problem je tento:
- htmlspecialchars tam ma, ale na spatnem miste, takze se de facto neaplikuje (aplikuje ho na neinicializovanou promennou $jmeno a v nasledujicim radku jeste prepise $_POST['jmeno'], proste obracene poradi instrukci), ale z napsaneho dotazu to nekteri pochopili tak, ze htmlspecialchars mu bezi, ale vadi mu, ze < se zobrazi jako <. Ja nejdriv taky, ale pak jsem pohledl na ten kod a videl problem.
Nookyn
Profil
Hele, už to funguje (najdete zde), opravil mi to kámoš General, ale jinak moc dík za rady... a sry za otravování...



ŘEŠENÍ:

<h1>Návštěvní kniha</h1>

<hr>

<?php
//pokud je zmáčknuto tlačítko Přidat
if (isset($_POST['pridat']))
   {
   //vybereme nejvetěí ID
   $ID=mysql_query("SELECT ID FROM kniha ORDER BY ID DESC LIMIT 1");
   $ID=mysql_fetch_array($ID);
   
   //nové ID je o jedna větší než to největší současné
   $ID=$ID['ID']+1;
   
//ošetříme data
    $nick = htmlspecialchars($_POST["nick"]);
    $text = htmlspecialchars($_POST["text"]);
    $text = nl2br($text); 
    
    $nick = mysql_real_escape_string($nick);
    $text = mysql_real_escape_string($text);
    $datum = StrFTime("%d.%m.%Y %H:%M:%S", Time());
    $ip = $_SERVER["REMOTE_ADDR"];
   
    mysql_query("INSERT INTO kniha (ID,nick,text,datum,ip) VALUES
('$ID','$nick','$text','$datum','$ip')");
    }
echo("<table><form method='post'>");
echo("<tr><td><b><span style='font-size: 12px;'>Nick:</span></b> </td><td><input type='text' name='nick' maxlength = '50'></td></tr>");
echo("<tr><td></td><td><textarea name='text' rows ='5' cols='75'></textarea></td></tr>");
echo("</table>");
echo("<input type='submit' name='pridat' value='Přidat příspěvek'>");
echo("</form>");

?> 

<br><br><br><br>

<table>
<?php
echo(stripslashes($Vypis));
$clanky = mysql_query('SELECT * FROM `kniha`');
$vysled = mysql_fetch_array($Vyber);

$Vyber = mysql_query('SELECT * FROM `kniha` ORDER BY ID DESC LIMIT 10');

while ($Vypis = mysql_fetch_array($Vyber)){
    $Vypis["text"] = stripslashes($Vypis["text"]);
	$Vypis["nick"] = stripslashes($Vypis["nick"]);
    echo("
<tr>
<td><span style='color: #0067a9; font-weight: bold; font-size: 15'>".$Vypis['nick']."</span>&nbsp;&nbsp;&nbsp;&nbsp;".$Vypis['datum']."&nbsp;&nbsp;&nbsp;&nbsp;".$Vypis['ip']."</td>
</tr>
<tr>
<td>".$Vypis['text']."</td>
</tr>
    ");
}
?>
</table>
Toto téma je uzamčeno. Odpověď nelze zaslat.