Autor Zpráva
srigi
Profil
hello, mam tento problem:

do DB (MySQL) ulozim nejaky string do pola typu VARCHAR. Pomocou PHP osetrim, ze znaky ako uvodzovky a apostrofy sa slashuju, cize ak kcem ulozit string "pokus", do DB doputuje \"pokus\". Chjo, ale ked zase z DB citam, nedostanem oslashovany string, ale DB mi vypluje iba "pokus".
Kua neviem co s tym. Toto spravanie sa mi nepaci, lebo je potom problem, ked budem ukladat lomitka.
BTW cez riadkoveho klienta, uplne to iste.
djlj
Profil
To ale není problém, to je dobře. Nebo bys byl pak rád, že musíš text (například nějaký článek) znovu ošetřovat (obírat o zpětná lomítka a další blbosti) při výpisu z databáze? Pokud ale ta data načítáš do nějakého formuláře, tak prostě použij třeba addslashes..

lebo je potom problem, ked budem ukladat lomitka.
\\ -> jedno lomítko

BTW cez riadkoveho klienta, uplne to iste.
Co to je?
Joker
Profil *
ak kcem ulozit string "pokus", do DB doputuje \"pokus\".
Nemáte pravdu. Do databáze putuje "pokus", což je taky v databázi uložené.
To escapování je pro PHP, takže po zpracování PHP z toho \"pokus\" vznikne "pokus".

Zkuste si například toto:
<?php
echo(" \"pokus\" ");
?>
Copak Vám to vypíše? ;-)
srigi
Profil
Jasne, chapem,

cize ja uz nemusim robit stripslashes po vybere z DB. Kedy sa potom to stripslashes pouziva?
srigi
Profil
Konkretne budem citovat jeden prispevok z diskusie na security-portal.cz

V PHP si neskrtnete, ukazka spatnyho programovani.
Je treba dat cisla do uvozovek, cisla osetrit IntVal(), desetiny DoubleVal()
a retezce AddSlashes(), ale kdyz retezce vyplivavate, tak zas StripSlashes()
na to se hodne zapomina,
Pro jistotu potlacovat chybovy hlaseni a logovat chyby.
Diky bohu za vyjimky v PHP5 a ste neznicitelny (obrazne :o)
Kajman_
Profil *
Používá se to v případě, že poslaná data z formuláře jsou slashována automaticky a je je třeba vypsat na stránce... pak se šáhne po stripslashes.
Joker
Profil
ale tohle je zase míněno na něco jiného.

Například - řekněme, že bych měl takový primitivní guestbook: id INT AUTO_INCREMENT, jmeno VARCHAR(20), text VARCHAR(255)
a skript by byl:
$jmeno = $_GET["jmeno"];
$text = $_GET["text"];
mysql_query("INSERT INTO guestbook VALUES(DEFAULT, \"$jmeno\", \"$text\")");

a někdo by zadal jméno třeba Pepa a text: "); DROP TABLE guestbook; --
a mysql_query by poslalo do databáze tenhle dotaz:
INSERT INTO guestbook VALUES(DEFAULT, "Pepa", ""); DROP TABLE guestbook; --")

tomuhle se říká "SQL injection".

K tomu je právě to addslashes(). Poprvé escapujete pro PHP a podruhé escapujete pro databázi.
Kajman_
Profil *
tomuhle se říká "SQL injection".

Až na to, že myslq_query nepovolí více dotazů oddělených středníkem, takže ten příklad není zrovna to pravé ořechové.
Joker
Profil
Jo a stripslashes se potom použije zase naopak, když ta data z databáze čtu.
Anebo, jak píše Kajman_, když se mi něco escapuje automaticky.

Mimochodem, případ, kdy stripslashes() oceníte:
Exituje věc zvaná "magic quotes", což je myslím věc, za kterou spousta PHP programátorů občas vymýšlí dostatečně krutý trest pro toho, kdo to vymyslel.

Jde o to, že v nastavení serveru je položka magic_quotes_gpc, která pokud ji zapnete, automaticky escapuje GET, POST a COOKIE data (proto gpc - get, post, cookie).
Hlavním výsledkem téhle vlastnosti je, že pokud programátor zároveň neovládá všechny servery, na kterých skript běží, nemůže si být nikdy jistý, jestli mu data přijdou escapovaná nebo ne.

Takže potom je dobré si napsat nějakou funkci
function nacti($promenna){

if(get_magic_quotes_gpc()) return(stripslashes($promenna));
else return($promenna);
}


a pak data zvenku načítat:
$jmeno = nacti($_GET["jmeno"]);
Joker
Profil
Kajman_
Já vím a původně jsem to tam měl i napsané, ale přišlo mi, že když za to napíšu "ale nebojte, stejně Vám to tabulku nesmaže", nebude to dost odstrašující :o)))

Shodneme se ale doufám na tom, že spoléhat na tohle by bylo hodně nerozumné.

Ale tak příklad, který bude reálně fungovat:
$vysledek = mysql_query("SELECT * FROM uzivatele WHERE jmeno=\"$jmeno\" AND heslo=\"".md5($heslo)."\"");
if(mysql_num_rows($vysledek) > 0) echo("Toto je tajná stránka");
else echo("Přístup odepřen");

pokud bych zadal libovolné heslo a jméno: " OR 1=1 --

vznikne dotaz:
SELECT * FROM uzivatele WHERE jmeno="" OR 1=1 --AND HESLO="*hash*"

a dostanu se na tajnou stránku i bez hesla.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0