Topic: Kaip apsisiaugoti nuo SQL injection

žinau, kad tai labai pavojinga ir nekartą esu nukentėjęs per šią spragą.
Kaip teisingai reikia parengti php kodą, kad duomenų įterpimas į mysql duombazę ar kitos funkcijos būtų saugios

išanksto dėkoju

SELECT * FROM users WHERE gender = 'female' AND size > 'enough' AND leftsize = rightsize AND age >= 18 AND age < 30 LIMIT 1

Re: Kaip apsisiaugoti nuo SQL injection

na tai ar kasnors žinot?

SELECT * FROM users WHERE gender = 'female' AND size > 'enough' AND leftsize = rightsize AND age >= 18 AND age < 30 LIMIT 1

3 (edited by foobar 2006-07-14 21:59:25)

Re: Kaip apsisiaugoti nuo SQL injection

hm, gyvų čia nedaug :D
šiaip, kiek mano žinios traukia, tai pagrindinis dalykas - escapinti visus kritiškus simbolius. Tik jokiu būdu ne su kokiu addslashes(), o su mysql_real_escape_string
Injection jau turėtum kaip ir negauti, dar aišku gali būti visokie buferio perpildymai, bet kaip su juo dorotis..hm, nu retas hackeris pabandys tuo užsiimti, bet turbūt reiktų tikrinti kokio dydžio info yra perduodama. Kas čia dar.. nu, lyg ir viskas. čiuju nieko naujo nepasakiau :/

Tiesa, prieš escapinant reikia pasižiūri ar neįjungta "magic_quotes", nes gali išeiti dvigubas escapinimas. Bet viskas yra funkcijos manuale ;)

Living in the zirgas galvas country.
Mano blog'as

Re: Kaip apsisiaugoti nuo SQL injection

Dėkui - didelsi ačiū

define("QUOTES_GPC", (ini_get('magic_quotes_gpc') ? TRUE : FALSE));
function stripinput($text) {
    if (QUOTES_GPC) $text = stripslashes($text);
    $search = array("\"", "'", "\\", '\"', "\'", "<", ">", "&nbsp;");
    $replace = array("&quot;", "&#39;", "&#92;", "&quot;", "&#39;", "&lt;", "&gt;", " ");
    $text = str_replace($search, $replace, $text);
    return $text;
}

kažin kaip šitas?

SELECT * FROM users WHERE gender = 'female' AND size > 'enough' AND leftsize = rightsize AND age >= 18 AND age < 30 LIMIT 1

Re: Kaip apsisiaugoti nuo SQL injection

FDisk wrote:

Dėkui - didelsi ačiū

define("QUOTES_GPC", (ini_get('magic_quotes_gpc') ? TRUE : FALSE));
function stripinput($text) {
    if (QUOTES_GPC) $text = stripslashes($text);
    $search = array("\"", "'", "\\", '\"', "\'", "<", ">", "&nbsp;");
    $replace = array("&quot;", "'", "\", "&quot;", "'", "&lt;", "&gt;", " ");
    $text = str_replace($search, $replace, $text);
    return $text;
}

kažin kaip šitas?

Hm, čia escapinamas html kodas, ne mysql dalis. Nuo to saugotis irgi reikia, bet čia jau ne SQL injection. Tam, beje, irgi yra specialios funkcijos, tad geriau naudoti jas- ir greičiau, ir, jei html standartas, pvz, kiek pasikeistų, kodas išliktų tinkamas (jei php būtų laiku atnaujinta :)) Jos būtų htmlspecialchars arba htmlentities .
Tai vat taip: html kritiški simboliai ir mysql kritiški - ne tas pats ;)

Living in the zirgas galvas country.
Mano blog'as

Re: Kaip apsisiaugoti nuo SQL injection

Teisingai foobar pastebėjo.

Aš tik pridursiu, kad saugantis nuo "sql injection" visus SQL užklausos parametrus verta patikrinti/validuoti. Dauguma PHP lib'ų/platformų turi vartotojo įvedamų duomenų tikrinimą, kad tarkim $_GET['id'] reikšmė tikrai yra sveikas teigiamas skaičius o ne tarkim "1;INSER INTO users (...";

Re: Kaip apsisiaugoti nuo SQL injection

prie to paties
http://shiflett.org/archive/184

Re: Kaip apsisiaugoti nuo SQL injection

php kalbos pliusas (o kartu ir minusas) yra tame, kad pas php nėra tipizuojami kintamieji. pvz jei vieną kartą $asilas yra skaičius, tai vėliau jis gali būti masyvas, objektas, ir t.t. tai aš stengiuosi visą laiką tikrinti tipus - ar masyvas (kai man reikia būtent masyvo), ar skaičius ir t.t. tada sumažėja problemų skaičius... šiaip dar visai nieko dalykas yra adodb, jis ten savyje turi daug visko, bet jo trūkumas kad jis griozdas šiek tiek.... na bet čia kaip kam ko reikia.

Re: Kaip apsisiaugoti nuo SQL injection

Radau geresni varijanta:

function escape($sql) {
 $safe_sql = mysql_real_escape_string($sql); // escape special characters
 $safe_sql = parent::escape($safe_sql); // parent method adds '' around $sql
 return $safe_sql;
}
SELECT * FROM users WHERE gender = 'female' AND size > 'enough' AND leftsize = rightsize AND age >= 18 AND age < 30 LIMIT 1