Diskuse
Téma: XSRF Protect 
Zaslal/a Pitva 27.2.2017 22:09
Zdravím, vím, že se zde tento problém řešil už několikrát, ale pořád si nějak nevím rady.
Chtěl bych si v administraci vytvořit jednoduchý modul pro přidávání obědových meníček. Je to v podstatě má první zkušenost s PHP, kdy se snažím zpatlat něco sám, takže je možné, že tam budou chyby.
Každopádně ten hlavní problém je, že vždy při odeslání formuláře mi to vypíše, že "Formulář nebyl odeslán s platným autorizačním tokenem".
Tady v diskuzi jsem zjistil, že se jedná o xsrf protect, tak jsem se to pokoušel implmentovat dle toho, co jsem tu našel, ale hláška se objevuje pořád.
Kód je zde:
<?php
/* --- kontrola jadra --- */
if(!defined('_core')) die;
/* --- skript pluginu --- */
if ($_POST)
{
DB::query('
INSERT INTO sd_menu (polevka, jidloA, jidloB, jidloC, desert)
VALUES (?, ?, ?, ?, ?)
', $_POST['polevka'], $_POST['jidloA'], $_POST['jidloB'], $_POST['jidloC'], $_POST['desert']);
}
$output .= '
<form method="post">
Polévka<br />
<input type="text" name="polevka" /><br />
Jídlo A:<br />
<input type="text" name="jidloA" /><br />
Jídlo B:<br />
<input type="text" name="jidloB" /><br />
Jídlo C:<br />
<input type="text" name="JidloC" /><br />
Desert:<br />
<input type="text" name="desert" /><br />
<p>
<input type="submit" value="Odeslat" />
</p>
<?php echo _xsrfProtect(); ?>
</form>
';
Děkuju za jakoukoli radu :-)
Každopádně děkuju za snahu :-)
http://sunlight.shira.cz/clanky/ochrana-formularu-xsrf-autorizacnim-tokenem
A takový insert do databáze je doufám, jen ilustrační a nikde ho nepoužíváš. Hodnoty vkládané do databáze je potřeba ošetřit. escapovaním, systém na to má i vlastní funkci
DB::esc()
Příklad použití:$jidlo = DB::esc(_post("jidlo"));
a tlačítko submit by mělo mít název, a pak podle něho dělat kontrolu
if(isset($_POST["formsubm"])){
...
}
<form...
...
<input type="submit" value="Odeslat" name="formsubm" />
...
</form>
Nicméně s tím tokenem pořád nevím, asi jsem úplně marnej.
Každopádně i když z toho tedy udělám tohle -
$output .= '
<form method="post">
"._xsrfProtect()."
Polévka<br />
<input type="text" name="polevka" /><br />
Jídlo A:<br />
<input type="text" name="jidloA" /><br />
Jídlo B:<br />
<input type="text" name="jidloB" /><br />
Jídlo C:<br />
<input type="text" name="JidloC" /><br />
Desert:<br />
<input type="text" name="desert" /><br />
<p>
<input type="submit" value="Odeslat" name="submit-btn" />
</p>
</form>
';
Tak mi to nefunguje ... nebo to zase používám špatně? :D
EDIT: Ok, ta chyba je zřejmě v typu uvozovek, že? :)
$output .= '<form method="post">'._xsrfProtect().'Polévka<br />...';
přečti si něco o spojování řetězců
Např i tady https://www.w3schools.com/php/php_mysql_prepared_statements.asp je vidět podobný zápis.
mysql
rozšíření nebyly).Pro vkládání dat do tabulky bych použil již existující
DB::insert()
metodu a nemusíš nic řešit:DB::insert('sd_menu', array(
'polevka' => _post('polevka'),
'jidloA' => _post('jidloA'),
'jidloB' => _post('jidloB'),
'jidloC' => _post('jidloC'),
'desert' => _post('desert'),
));
Pokud píšeš dotazy, ošetřuj dynamické hodnoty pomocí
DB::val()
:DB::query('SELECT col FROM table WHERE id=' . DB::val($id));
Není na tom nic nebezpečného, jen na to nesmíš zapomenout

Chybu s tokenem to již nevyhazuje. Ale ještě se zeptám, i když vím, že to přímo nesouvisí nijak se SL, ale nevíte, kde by mohl být problém, že mi to ty data neukládá do DB?
DB mám vytvořenou takto -
http://www.imagehosting.cz/images/dbupu.png
sd_menu a sd-menu je podstatný rozdíl.