Autor Zpráva
Jean
Profil
Rozhodl jsem se že konečně zahodím register_globals, ale ted sem narazil zrejme na trivialni problem, ale chci se zeptat na jeho možná řešení.
Když pošlu z formuláře POSTem nějakou hodnotu proměnný, a pak chci tuhle proměnnou zpracovat v MYSQL příkazu, tak mi to vyhodí hlášku o chybějící proměnný, PHP to nepozá jako celek, ale jako rozdělěný.

Příklad:
: $data = mysql_query("SELECT * FROM tabulka WHERE nick LIKE \"$_POST['user']\"") or die ("Nepovedlo se provést databázový dotaz1.");


jak to řešíte vy? to je potřeba převést to na nějakou jinou proměnnou?

Díky

Jean
WertriK
Profil *
ja bych to zkusil obejit takto :

$user = $_POST['user'];
$data = mysql_query("SELECT * FROM tabulka WHERE nick LIKE '$user'") or die ("Nepovedlo se provést databázový dotaz1.");
Hugo
Profil
Jean

Jde to uplne jednoduse
$data = mysql_query("SELECT * FROM tabulka WHERE nick LIKE '".$_POST['user']."'")

Musis pouzit operator na spojovani retezcu, coz je '.'. Prip. novou promennou, viz Wertrik.
krteczek
Profil
dělá se to takhle:
$data = mysql_query("SELECT * FROM tabulka WHERE nick LIKE  '{$_POST['user']}' ") or die ("Nepovedlo se provést databázový dotaz1.");


ALE!!!!
POKUD TO CHCEŠ POUŽÍT MUSÍŠ SI NEJPRVE SKONTROLOVAT ŽE V TOM POSTU NENÍ NIC NEBEZPEČNÉHO
například:

if(!empty($_POST['user'])) //kontrola že není proměnná prázdná->isset jen zjistí jestli existuje,empty jestli existuje a nerovná se prázdné
{
//tady si ošetři na povolené hodnoty
//teprve pokud bude v pořádku tak ji použij na dotaz do db
//jo a asi nejlepší volba by mohla vypadat takhle(dle wertíka)
$user=""; //vynulovat
$user=$_POST['user']; //předat
if($user==tady si to zvaliduj podle potřeb)
{
//je to v pořádku
if($data=mysql_query("SELECT * FROM tabulka WHERE nick LIKE '{$user}' "))
{
//dotaz se povedl zvaliduj co ti vypadlo
}
else
{
//dotaz se nepovedl: podle typu nasazení vyhod co se stalo
//třeba si vytvoř funkci která ti bude podle nastavení vyhazovat chyby
//neutrální pro provoz, a s detaily pro testy
}
}
else
{
vyhod nějakou chybu
}

krteczek
Hugo
Profil
krteczek

Jojo, to je samozrejme 100% pravda. Jen me to po ranu netrklo.

Zvlast u db je na to potreba davat bacha.
tark
Profil
mmj. nejlepší jsou funkce typu postVar() apod. víc na http://continuer.nfo.sk/magic_quotes-aneb-jak-na-ne/
Jean
Profil
jo diky za navrhy, co se tyce toho testovani na obsah, tady zadny velky nebezpeci nehrozi, skript kterej to odesila si sam pohlida pri odeslani, aby tam byly spravny hodnoty a mam pocit ze pak uz nikdo nema sanci nainjectovat $_POST["foo"] promennou, nebo se pletu?
Hugo
Profil
Jean

If myslis hlidani pomoci javascriptu, tak to rozhodne neni bezpecne.
Jean
Profil
Ne myslim ohlidani pomoci PHP+JavaScript, proste neco podobneho co navrhuje krteczek, ale uz na urovni odeslani... ale spis me zajima ta druha otazka, ma utocnik nejakou sanci a nasimulovat $_POST pole?
Hugo
Profil
To nejak nechapu. Pokud hlidas promennou $_POST['user'], tak ji pomoci php testujes az na serveru, takze nevim co myslis tou simulaci $_POST.
Jean
Profil
jo, testuje se az na serveru, jenom v jinej casovej okamzik, otazka je prosta, da se nainjectovat promenna ve formatu $_POST["neco"]??
Leo
Profil
"otazka je prosta, da se nainjectovat promenna ve formatu $_POST["neco"]?"

Urcite, stejne snadno jako promenna $_GET["neco"], slysel jste neco o formulari? Leo
Hugo
Profil
Jean

Nejlepsi je vzdy otestovat vsechny vstupni udaje. Protoze lidi jsou svine :-)
Jean
Profil
2Leo: no asi sme se spatne pochopili, nicmene nevadi, uz sem to zda se vyresil...

2Hugo: JO, mas recht, lidi SOU svine:)

diky vsem za nazory...

Jean
llook
Profil
$_POST["neco"] se myslím nedá nastavit jinak než posláním metodou POST. Třeba index.php?_POST[neco]=neco proměnnou $_POST['něco'] nevytvoří, ani při zapnutých register_globals, jestli otázka byla myšlena takto.
krteczek
Profil
je to myšleno tak že nemusí být tím klientem prohlížeč, ale třeba nějaký skript a odeslat get jako post a opačně není problém, protlačit do skrytých a needitovatelných polí své proměnné také ne. a že se mi to nepodaří z tvé stránky? mužu udelat stejný formulář jinde s tím že všechny hodnoty budu moct zadat podle libosti a tvá kontrola javaskriptem ti bude k ničemu ( jde ho taky vypnout ). Prostě pokud někdo bude mít chut se tvým skriptum kouknout na zoubek ( důvody není důležitý důležitá je chuť ), tak to udělá, a je jen na tobě jestli jsi pamatoval na takovou možnost, a bránil se dopředu. ono mít smazanou/změněnou db kvuli pitomě ošetřenému vstupu nasere... a někdy to i bolí ...To když člověk bije hlavou o zed .-)
kkrteczek
Jean
Profil
zda se ze Ilook je jedinej kdo mi dal smysluplnou odpoved, na to na co jsem se tady uz 3x ptal:)

2krteczek: vsecko hezky, ale porad se bavime o moznosti injections promennych. jinak nemysli si, ze sem takovej blazen abych to nechal jen na JavaScriptu...:)

Jean
Hugo
Profil
Jean

Nejak nechapu proc se na to ptas, prece neni problem udelat formular, ktery bude mirit na http://tvuj.server.neco/index.php a metodou POST ti tam ty data narve (jak psal Leo).
error414
Profil *
je to myšleno tak že nemusí být tím klientem prohlížeč, ale třeba nějaký skript a odeslat get jako post a opačně není problém, protlačit do skrytých a needitovatelných polí své proměnné také ne. a že se mi to nepodaří z tvé stránky? mužu udelat stejný formulář jinde s tím že všechny hodnoty budu moct zadat podle libosti a tvá kontrola javaskriptem ti bude k ničemu ( jde ho taky vypnout ). Prostě pokud někdo bude mít chut se tvým skriptum kouknout na zoubek ( důvody není důležitý důležitá je chuť ), tak to udělá, a je jen na tobě jestli jsi pamatoval na takovou možnost, a bránil se dopředu. ono mít smazanou/změněnou db kvuli pitomě ošetřenému vstupu nasere... a někdy to i bolí ...To když člověk bije hlavou o zed .-)
kkrteczek


tak to musim oponovat, je problem odeslat pozadavakek na server tak aby byla naplnena promena $_POST["neco"], ja to musel vyresit funkci fsocketopen, nebo nejak tak. Byl to skaredy kod.
Anonymní
Profil *
Nejak nechapu proc se na to ptas, prece neni problem udelat formular, ktery bude mirit na http://tvuj.server.neco/index.php a metodou POST ti tam ty data narve (jak psal Leo).

Ak kontroluje referer, tak mozes ist vies kam s formularmy... ;))
Leo
Profil
"Ak kontroluje referer, tak mozes ist vies kam s formularmy... ;))"

Vazne si myslite, ze referer nejde podvrhnout? Netvrdim, ze ve statickem HTML, ale v PHP vam to napisu za chvilku. Leo
Anonymní
Profil *
Leo

Treba vediet sa ochranit... Referer je len jedna z moznosti... Najlespie je, nikoho neinformovat o tvojom zdrojaku :)) ani o ziadnej jeho casti.
krteczek
Profil
Anonymní: no a jsme zase u toho. není bezpečne to, co je neznámé, jen je to trošku obtížnější se tomu dostat na zoubek.
v každém případě je třeba pamatovat i na tu nejméně pravděpodobnou variantu a skripty chránit.
krteczek
Toto téma je uzamčeno. Odpověď nelze zaslat.