PHP fóra: Builder | JakPsatWeb | Webtrh
Nejste přihlášen(a)
Trošku si tu hraju s Texy a obarvováním kódu přes FSHL a řeším problém.
Při vkládání do databáze mi nejde vložit php kód, který má apostrofy. Uvozovky se slashují, jenže apostrofy ne. Přemýšlel jsem, kam tento post hodit a nakonec jsem ho hodil tady.
Vkládám pomocí Dibi, parsuju pomocí Texy, kód vypadá nějak takto
<?php
$popis = stripslashes($values['popis']);
$clanek = stripslashes($values['clanek']);
$texy = new AdminTexy();
$texy->addHandler('block', 'blockHandler');
$htmlPopis = $texy->process($popis);
$htmlClanek = $texy->process($clanek);
$this->db->query("INSERT INTO noviny_clanky(seonadpis,nadpis,popis,clanek,texypopis,texyclanek,autor,kategorie,datum, nepublikovat)
VALUES('$seonadpis','$nadpis','$htmlPopis',
'$htmlClanek','$popis','$clanek','$autor',
'$kategorie',now(),'$nepublikovat')");
?>
Jak říkám, na kód pouze s uvozokama to funguje jak má, ale na webu FSHL jsem viděl, že jde obarvovat i kód s apostrofy a tak mi není jasné co dělám špatně. Jak upravit SQL dotaz tak, aby neházel chybu na prvním apostrofu?
http://OpiciNoviny.cz – čtení nejen pro opice :P
Nechápu, proč před vložením do databáze používáš funkci
stripslashes…?
Jinak je problém v tom, že vkládáš hodnoty do databáze přímo bez nějakého kontrolování vstupních dat. Tohle za tebe dibi dokáže řešit, ale musíš ji (ho?) nechat. Zkus tedy něco ve smyslu:
$record = array(
'seonadpis' => $seonadpis, // použije se automaticky modifikátor %s pro řetězce
'nadpis' => $nadpis,
'popis' => $htmlPopis,
'clanek' => $htmlClanek,
'texypopis' => $popis,
'texyclanek' => $clanek,
'autor' => $autor,
'kategorie' => $kategorie,
'datum%sql' => 'NOW()', // explicitně nastavený modifikátor %sql pro volání procedury
'nepublikovat' => $nepublikovat,
);
$this->db->query("INSERT INTO noviny_clanky", $record);
Nehledě na to, že je to mnohem přehlednější…
Edit: kravco: Jako vejce vejci ;)
Editoval vlki (18. 5. 2009 16:49)
Ukážkový SQL Injection :)
V tomto ti pomôže samotné dibi, treba ale dopyt na databázu zostavovať správne:
// sanitizácia & úpravy ako predtým...
$sqlValues = array(
'seonadpis' => $seonadpis,
'nadpis' => $nadpis,
'popis' => $htmlPopis,
'clanek' => $htmlClanek,
'texypopis' => $popis,
'texyclanek' => $clanek,
'autor' => $autor,
'kategorie' => $kategorie,
'datum%sql' => 'NOW()', // „%sql“ označuje, že tento parameter je čisté SQL
'nepublikovat' => $nepublikovat,
);
$this->db->query('INSERT INTO novinky_clanky %v', $sqlValues);
Edit: pekná zhoda :)
Editoval kravco (18. 5. 2009 16:48)
Díky moc
vlki napsal(a):
Nechápu, proč před vložením do databáze používáš funkcistripslashes…?
Bylo to v příkladu Texyly. Navíc se mi zdá lepší stripovat to před vkládáním než při každém výpisu.
http://OpiciNoviny.cz – čtení nejen pro opice :P
Kenn napsal(a):
Bylo to v příkladu Texyly. Navíc se mi zdá lepší stripovat to před vkládáním než při každém výpisu.
Do databáze se to ale slashované neuloží. Tedy pokud se to někde neslashuje dvakrát. Není tedy potom po vyzvednutí z DB potřeba nic stripovat (OT: pod tímto slovesem se mi evokuje úplně jiná činnost než odstraňování zpětných lomítek :D)
Tomik – tomik@jmx.cz | http://tomik.jmx.cz
bez stripslashes zůstávají po výpisu \n znaky, takže těžko říct
http://OpiciNoviny.cz – čtení nejen pro opice :P
Kenn napsal(a):
bez stripslashes zůstávají po výpisu \n znaky, takže těžko říct
Co znamená, že zůstávají \n znaky? To jako že se vypíše
ten znak (tedy odřádkování)? Pak je to ale podle mě naprosto v pořádku.
Pokud se vypíší vždy dva znaky \ a n za sebou, pak
dochází k tomu (pravděpodobně), že jsou do dat dvakrát přidány zpětná
lomítka.
Tomik – tomik@jmx.cz | http://tomik.jmx.cz
Data vrácená z databáze se nijak neupravují. Navíc metody addslashes nebo stripslashes nemají takřka žádný smysluplný význam. Viz Escapování – definitivní příručka.