PHPben meglévő értékhez való hozzáadás?
A kérdésem az lenne, hogy hogyan lehetne azt megcsinálni, hogy:
Pl van ez:
$sql = "UPDATE users.list Set coin='200' WHERE id='".$_POST['ref']."' " ;
És, hogy ne 200ra állítsa a coin oszlop értékét, hanem ha annak alapból van értéke (pl 500), akkor 500+200 legyen, tehát 700?
$result2 = mysql_query($sql2) ;
Amúgy pont emiatt a PHP-ban van védelem erre. Magic quote névre hallgat. A MySQL szépen le is kezeli. Emiatt viszont figyelni kell a POST-ból kérkező adatokra, mert a \ jelet \\ -re, az idézőjeleket \' illetve \" -re cseréli. De biztos, ami biztos érdemes a saját kódodban is lekezelni a dolgot.
Pl. ha az id a kérdésben található lekérdezésnél szám, akkor érdemes ellenőrizni, hogy valóban szám-e.
De még sok dologra lehet figyelni. Pl. hogy mi történik, ha valaki egy másik számot ír be a ref-hez, baj-e. Mi van, ha sokszor küldi el a POST kérést, lekezeli-e a rendszered.
Érdemes kicsit megtanulni hackerkedni. Csak az a lakatos tud igazán jó zárat csinálni, aki betörőnek is jó lenne. Hiszen csak így tudja, milyen trükkök ellen kell védenie annak, amit csinál.
Én pl. ha számot kell ellenőrizni, akkor valami ilyesmit szoktam elkövetni:
$hiba=false;
if (!empty($_POST["szam"])) {
$szam=floor(1*trim($_POST["szam"]));
if ($szam!=$_POST["szam']) … /nem egész szám jött be
} else $hiba=true; //hiányzó paraméter
Persze hogy a szám megfelel-e értékhatároknak, azt külön kell ellenőrizni. Pl. ha adatbázisban található id-ről van szó, akkor – amennyiben a nem létező rekord gondot okozna – ellenőrizni kell, hogy valóban létezi-e ilyen id-vel rekord.
* * *
Szöveg ellenőrzése már kissé bonyolultabb témakör lehet. Erre van egy nagyon jó eszköz: reguláris kifejezés. Ez mondjuk egy külön nyelv, aminek a hatékony elsajátítása időt vesz igénybe, de megéri, mert nagyon jól lehet használni sokféle célra.
Lásd: [link]
Pl. ha egy szöveg csak kisbetűt számot és aláhúzást tartalmazhat, valamit nem kezdődhet számmal (lásd: változónév), akkor ezt így tudod ellenőrizni:
if (preg_match("/^[a-z_]+[a-z0-9_]*$/i",$szoveg)) echo "helyes!"; else echo "hibás!";
(A ^ a sor elejét jelenti a $ a sor végét. A kapcsos zárójelek egy karakterhalmazt adnak meg a-z és _ illetve a-z és 0-9 és _
A + jel a halmaz végén 1 vagy több előfordulást enged meg, a * jel a halmaz végén 0 vagy több előfordulást jelent. A többinek nézz utána Google-lal.)
* * *
Mint mondtam a legtöbb szerveren működik a magic quote és gyakorlatilag megoldja a problémákat. De célszerű inkább saját magad kezelni a dolgot.
Egyrészt vedd ki a magic quote-ot. Másrészt használd a PHP ehhez készített fügvényét, ami a speciális szimbólumokat az SQL nyelvnek megfelelően alakítja át. Nem árt még, ha a szöveg elején és végén található szóközöket is eltávolítod, ha azoknak nincs valós szerepük:
$szoveg=stripslashes(trim($_POST["szoveg"]));
…
$sql="SELECT … " . mysql_real_escape_string($szoveg) . " … ";
Így a $szoveg-ben is és a $sql-ben is az lesz, ami a tényleges szövegnek kell lennie.
Persze itt még nincs vége. A kiiratásnál megint csak figyelni kell, hogy pl. HTML tagek ne kerüljenek ki, mert az meg XSS támadásra adhat okot. (Pl. ha valaki a <script>alert('hehe');</script> üzenetet küldi el, az kellemetlen, de ennél durvább dolgokat is el lehet érni.)
Szóval kiiratásnál minimum: echo htmlspecialchars($szoveg);
De lehet még bonyolítani. Pl. itt a gyakorikerdesek.hu -n nem jól kezeli az üzenetben a sor eleji szóközöket. Vagy pl. a sortörést is át kell ugye alakítani <br />-é.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!