< návrat zpět

Diskuse


Téma: XSRF Protect rss

Zaslal/a 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 :-)

Zaslat odpověď >

Strana:  1 2   další »
#020635
avatar
Možná zkusit dát tomu submitu název
#020636
avatar
Tak bohužel, zkusil jsem mu přidat name, ale stále neplatný token ...

Každopádně děkuju za snahu :-)
#020637
Jirka Daněk
Problém je v tom jak ten zápis používáš.
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>
#020638
avatar
No ... ilustrační není a hádám, že je špatně. Píšu to podle jednoho návodu a tam se dušují, že tohle je správný a bezpečný způsob :D Ok, tohle přepíšu.

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? :)
#020639
Jirka Daněk
Ten návod ani nechci raději vidět a ano, je to v uvozovkách...
$output .= '<form method="post">'._xsrfProtect().'Polévka<br />...';

přečti si něco o spojování řetězců
#020640
avatar
No Jirko on ten návod samozřejmě může být zcela správně, protože to vypadá, že zápis toho SQL je třeba pro nějaký DB layer jako třeba dibi a tam je to ošetřené. Samozřejmě to je ale správně pouze při použití toho daného layeru. Pro SL je to špatně.

Např i tady https://www.w3schools.com/php/php_mysql_prepared_statements.asp je vidět podobný zápis.
#020641
Shira
SL z historických důvodů nepoužívá prepared statements (v tehdejším 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 1
#020642
avatar
Děkuju všem moc za rady :)

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
#020653
avatar
Neukládají se data, protože se nemají kam ukládat - tabulka použitá v dotazu není v databázi.
sd_menu a sd-menu je podstatný rozdíl.
#020654
avatar
Pravda ... to jsem idiot. Ale i když to v kódu upravím na sd-menu, tak mi to data neukládá ...

Strana:  1 2   další »