Pitäisi tallentaa passun hash ja teksti mySQL tietokantaan PHP:llä. Riittääkö kyseiset toimet:
$teksti = htmlspecialchars(addslashes( $_POST['teksti'])); \\ Passulle ei varmaan tätä vaan tämä riittäneen $hash = md5($passu)? -> UPDATE users SET teksti='$teksti' AND hash='$hash' WHERE userid='$userid';
Ja komento stripslashes($teksti) suoritettaneen vielä juuri ennen kuin teksti halutaan näyttää selaimessa siinä muodossa kuin se on annettu.
Kysymys kuuluu siis riittääkö kyseiset toimet niin että säilyisi SQL-injektioilta? Kiitos!
$teksti = htmlspecialchars(addslashes( $_POST['teksti'])); \\ Passulle ei varmaan tätä vaan tämä riittäneen $hash = md5($passu)? -> UPDATE users SET teksti='$teksti' AND hash='$hash' WHERE userid='$userid';
Ja komento stripslashes($teksti) suoritettaneen vielä juuri ennen kuin teksti halutaan näyttää selaimessa siinä muodossa kuin se on annettu.
Kysymys kuuluu siis riittääkö kyseiset toimet niin että säilyisi SQL-injektioilta? Kiitos!
Vastaukset 10
Vanhimmat
Mieti laajennettavuutta. Jos haluatkin joskus esittää tietoja jossain muutta kuin HTML muodossa niin ongelmia tuleepi. Ennemmin kantaan syöte sellaisenaan ja tulostusvaiheessa vasta muotoilut jne... Tietenkin syöte tehdään ennen kantaan laittoa turvallises vaik tuol mysql_real_escape_string. Myös magic_quotes kannattaa huomioida, ettei tuu tuplia //
addslashes tuon tilalle ennemmin tietokannan oma http://fi.php.net/manual/fi/function.mysql-real-escape-string.php turvallisempa.
Tuossa koodinpätkässä ei käyny ilmi mitä juttuja teet $userid, ellet mitään niin SQL injektiot mahdollisia. Joten laita se ainakin mysql_real_escape_string läpi, tosin id yleensä numeroita, joten ennemmin katsot että tuo on vain numeroita.
*UPDATE users SET teksti='$teksti' AND hash='$hash' WHERE userid='$userid';*
Empäs huomannutkaan väsyneenä, mutta eikös tuo kysely ole väärin. http://dev.mysql.com/doc/refman/5.0/en/update.html Joten AND tilalle ,
Tässä pien esimerkki
$userid saa tiedoksi ' or userid != '0 niin käytännössä kaikki tiedot päivitetään samoiksi.
Hoitaako toi mysql_real_escape_string() tosiaan koko hoidon?! Eli $teksti = mysql_real_escape_string( $_POST['teksti']); - Riittänee? Entä jos syöte on vaikka passulle -> ('terve' AND 'x = x')?
"--mitä teet $userid, ellet mitään niin SQL injektiot mahdollisia."
- Tunnistan henkilöt ID:n avulla -> $userid = mysql_insert_id(); (Auto_Increment) ja tarkistus ctype_digit(), kiitti. :)
"Myös magic_quotes kannattaa huomioida, ettei tuu tuplia"
- Tätä en oikeen ymmärrä? Löysin kuitenkin tälläisen tuosta magic_quotes_gpc:
"Sets the magic_quotes state for GPC (Get/Post/Cookie) operations. When magic_quotes are on, all ' (single-quote), " (double quote), \ (backslash) and NUL's are escaped with a backslash automatically."
Toisin sanoen pitäiskö aina tulostus vaiheessa käyttää striplashes(), kun toi on päällä? (Olettaen tietysti, että kaksi muuta magic_quotes-asetusta OFF.) - Syöteellä "xxx\\" tuohon tarvitsisi kuitenkin jokin toinenkin ratkaisu..?
*Hoitaako toi mysql_real_escape_string() tosiaan koko hoidon?! Eli $teksti = mysql_real_escape_string( $_POST['teksti']); - Riittänee?*
Kyllä riittää. Sitten tulostus vaiheessa stripslashes ja htmlspecialchars jos HTML haluat.
*Entä jos syöte on vaikka passulle -> ('terve' AND 'x = x')?*
Tuo functio lisää \ merkin ' eteen jolloin se on vaaraton. Siis tällöin et pysty katkasemaan lohkoa ' " merkeillä ja lisäämään omia juttuja. Sama juttu PHP:ssä
echo "teksti " "; // error
echo "teksti \" "; // toimii
*- Tunnistan henkilöt ID:n avulla -> $userid = mysql_insert_id(); (Auto_Increment) ja tarkistus ctype_digit(), kiitti. :)*
Tuossa tapauksessa ei tartte tarkistaa koska itse haet haet tuon tiedon, eikä käyttäjä siitä pysty muuttaa. Ennemmin turhia tarkistuksia kuin tarkistamattomana kantaan.
*Toisin sanoen pitäiskö aina tulostus vaiheessa käyttää striplashes(), kun toi on päällä? *
Kyllä toimit samoin kuin käyttäessä addslashes functiota. Katso http://fi.php.net/manual/fi/function.get-magic-quotes-gpc.php siinä esimerkissä neuvotaan miten tuo asetus tunnistetaan, teet siitä vaik oman function jolloin käyttö helppoa.
*Hoitaako toi mysql_real_escape_string() tosiaan koko hoidon?! Eli $teksti = mysql_real_escape_string *($_POST['teksti']); - Riittänee?
*
*Kyllä riittää. Sitten tulostus vaiheessa stripslashes ja htmlspecialchars jos HTML haluat.
Onko toi sama siitä huolimatta vaikka magic_guotes_gpc = Off? Eli ei tarvii mitään: $teksti = mysql_real_escape_string(*addslashes*( $_POST['teksti']));? Mutta muuten GET, POST, and COOKIE tuota addslashes() tarvitaan?! Ei oo niille omaa funktiota? Kiitos :)
*Onko toi sama siitä huolimatta vaikka magic_guotes_gpc = Off? Eli ei tarvii mitään: $teksti = mysql_real_escape_string(*addslashes*( $_POST['teksti']));? *
Et tartte mitään tuommosia. Tässä lainauksia manuaalista. Kiinitä huomiota mihkä merkkeihin vaikuttaa.
magic_quotes_gpc
When magic_quotes are on, all ' (single-quote), " (double quote), \ (backslash) and NUL's are escaped with a backslash automatically.
addslashes
These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).
mysql_real_escape_string
which prepends backslashes to the following characters: NULL, \x00, \n, \r, \, ', " and \x1a.
Mielestäni tuo magic_guotes_gpc on nykyisellään turha ja sekoittaa hieman, joten itse tykkään säätää sen aina off ellei ole.
*Mutta muuten GET, POST, and COOKIE tuota addslashes() tarvitaan?! Ei oo niille omaa funktiota? Kiitos :)*
Jos laitat tietokantaan niin silloin käytät tuota mysql_real_escape_string. addslashes funciota ei useinkaan tartte. Toisaaltaan addslashes toimii muiden tietokantojen kanssa eikä pelkästään MySQL kuten tuo mysql_real_escape_string tekee.
*addslashes funciota ei useinkaan tartte.
*
Kyllähän addslashes:ta joutuu käytää ainakin inputtejen kanssa aika usein - ainakin kun tuo magic_quotes_gpc Off?!
Esim. $_POST['torpeedo'] = " kissa"kala' "; - Eikö siis tässä tilanteessa addslashes on suotava vai onko tuohonkin jokin toinen funktio? =P
----- Pien juttu viel -----
Kannattaako käyttäkätiedoissa hyväksyä kaikki merkit? Onko jotain rajoituksia mm. emailin osalta? Eli saako käyttänimi olla vaikka: "||Mari"o&T'ar^*\nå|l" tai vastaava? Kiitti =D
*Kyllähän addslashes:ta joutuu käytää ainakin inputtejen kanssa aika usein - ainakin kun tuo magic_quotes_gpc Off?!*
En ainakaan itse ole joutunut. Riippuu tosin täysin mitä olet tekemässä, lähinnä tuota tarttee vain tietokannan kanssa ja silloinkin usein tietokannan omaa vastaavaa functiota voi käyttää.
*Esim. $_POST['torpeedo'] = " kissa"kala' "; - Eikö siis tässä tilanteessa addslashes on suotava vai onko tuohonkin jokin toinen funktio? =P*
Riippuu mitä olet tuolla tiedolla tekemässä, jos tiedostoon tallennat, tulostat sivulle jne... niin silloin ei tartte. Noita addslashes ja vastaavia käytetään vain silloin jos " ' jne... sekoittavat tai aiheuttavat haittaa tietoturvan kannalt.
*Kannattaako käyttäkätiedoissa hyväksyä kaikki merkit? Onko jotain rajoituksia mm. emailin osalta? Eli saako käyttänimi olla vaikka: "||Mari"o&T'ar^*\nå|l" tai vastaava? Kiitti =D*
Riippuu ihan tapauksesta, esim nimimerkissä voit hyväksyä kaik merkit mutta taasen ihmisten nimissä vain aakkoset ja kenties numerot (eikös niitä ulkomailla saa käyttää nimes).
Emailin osalta voi tietenkin tarkistaa onko käytetty sallittuja merkkejä mutta tämä ei kerro että onko osoite toimiva tai edes kävijän oma. Joten foorumeissa jne... pyydetään kuittaamaan email oikeaksi. Lukaseppas vaik http://www.zend.com/zend/spotlight/ev12apr.php
Ja mikäli email tarkistushommelin laittaa niin sen pitää ehdottomasti hyväksyä kaikki sallitut email osoitteet. Itselläni [email protected] niin monen monituista kertaa emailini tulkitaan virheelliseksi jopa nettikaupoissakin, ongelman aiheuttaa tuo numero.
Miten sit korvaat tuon, ettet käytä addslashes() paljon. Teetkö näin: echo "cat \"fish'"; vai käytätkö Regex vai jotain muuta? Tuossa testaillessa tulkikin mieleen miksi addslashes ei liene toimivan tässä: echo addslashes("cat "fish'"); eli mitenkä edes tallennetaan pelkkiä """? Yritin sulkeita ja kaikenmoista muttei tärppää?
Toi tieto ks. [email protected] tulikin tarpeeseen. Oon juuri väsäämässä tuommosta juttua. Kiitti! :)
Ps: Oot Paras!
*Miten sit korvaat tuon, ettet käytä addslashes() paljon. Teetkö näin: echo "cat \"fish'"; vai käytätkö Regex vai jotain muuta?*
Tuo addslashes ja vastaavat on lähinnä käyttäjän syötteitä varten. Ja omat tulostus jutut hoidetaan toisel tapaa.
Katsos http://fi2.php.net/echo sielt selviää miten tuo onnistuu.
Itse käytän usein jos pitää enempi tekstiä tulostella allaolevaa.
echo