Autorius Tema: Apsauga nuo sql injection  (Skaityta 706 kartus)

Neprisijungęs minfas

  • Naujokas
  • *
  • Įrašai: 12
  • Karma: +0/-0
    • Žiūrėti profilį
Apsauga nuo sql injection
« Įrašytas: 2013-06-25 20:10:46 pm »
Sveiki, man kilo toks klausimas: username ir email filtruoju su mysql_real_escape_string. O ar reikia filtruoti pass laukelį?

Neprisijungęs Modestas Vaitkevičius

  • Dalyvis
  • **
  • Įrašai: 2005
  • Karma: +56/-16
    • Žiūrėti profilį
    • Apie mane
Ats: Apsauga nuo sql injection
« Atsakymas #1 Įrašytas: 2013-06-25 20:14:02 pm »
Visus reikia, tačiau nenaudok mysql_* funkcijų :)

Neprisijungęs Kalnų karalius

  • Naujokas
  • *
  • Įrašai: 104
  • Karma: +0/-0
    • Žiūrėti profilį
Ats: Apsauga nuo sql injection
« Atsakymas #2 Įrašytas: 2013-06-25 20:28:04 pm »
Tai ko negali iš karto pasakyti kad reikia naudoti mysqli_*. Tai ne matai, tyli, išsipisinėja iš naujoko!
4c61626173212

Neprisijungęs Modestas Vaitkevičius

  • Dalyvis
  • **
  • Įrašai: 2005
  • Karma: +56/-16
    • Žiūrėti profilį
    • Apie mane
Ats: Apsauga nuo sql injection
« Atsakymas #3 Įrašytas: 2013-06-25 20:58:01 pm »
Karaliau, kuo toliau tuo labiau man ant tavęs kyla itarimas :)

Anyway, nesakiau, nes info IEŠKOJIMAS yra naudingas :)

Beto, aš nesakiau, nes nepatariu naudoti ir mysqli_* funkcijų ;) Deja, bet rekomenduoju PDO, nes ten matau daugiau perspektyvų :)
« Paskutinį kartą keitė: 2013-06-25 21:04:52 pm sukūrė Modestas Vaitkevičius »

Manualai.lt Forumas

Ats: Apsauga nuo sql injection
« Atsakymas #3 Įrašytas: 2013-06-25 20:58:01 pm »

Neprisijungęs minfas

  • Naujokas
  • *
  • Įrašai: 12
  • Karma: +0/-0
    • Žiūrėti profilį
Ats: Apsauga nuo sql injection
« Atsakymas #4 Įrašytas: 2013-06-26 08:01:17 am »
Tokio kodo užtenka, norint apsisaugot? Galima $name = $_GET['username']; pakeist į $name = $_POST['username'];? Ir kodėl v
VALUES yra ?,? o ne kintamieji?
<?php
$name 
$_GET['username'];
$password $_GET['password'];
 
if (
$stmt $mysqli->prepare("INSERT INTO tbl_users (name, password) VALUES (?, ?)")) {
 
    
// Bind the variables to the parameter as strings. 
    
$stmt->bind_param("ss"$name$password);
 
    
// Execute the statement.
    
$stmt->execute();
 
    
// Close the prepared statement.
    
$stmt->close();
 
}
?>
« Paskutinį kartą keitė: 2013-06-26 08:03:37 am sukūrė minfas »

Neprisijungęs Modestas Vaitkevičius

  • Dalyvis
  • **
  • Įrašai: 2005
  • Karma: +56/-16
    • Žiūrėti profilį
    • Apie mane
Ats: Apsauga nuo sql injection
« Atsakymas #5 Įrašytas: 2013-06-26 08:29:45 am »
Galima name pakeisti į $_POST[] ir tai būtina, tačiau keisk ir formoje esantį metodą iš GET į POST :)
Dėl ?,?, tai žiūrėk toliau komentaras kur yra Bind the variables to the parameter as strings, o tai reiškia, kad su $stmt->bind_param(); tu nurodai, kad tie klaustukai bus tavo $name ir $password :)

Neprisijungęs minfas

  • Naujokas
  • *
  • Įrašai: 12
  • Karma: +0/-0
    • Žiūrėti profilį
Ats: Apsauga nuo sql injection
« Atsakymas #6 Įrašytas: 2013-06-26 20:05:35 pm »
Ačiū už pagalba :) Bet jau ilgai vargstu prie kodo:
<?php
if ($insert_user $dbh->prepare("INSERT INTO users (username, email, pass, group) VALUES (?, ?, ?, ?)")) {
 
    
// Bind the variables to the parameter as strings. 
    
$insert_user->bind_param($dbh"ssss"$username$email$pass0);
 
    
// Execute the statement.
    
$insert_user->execute();
 
    
// Close the prepared statement.
    
$insert_user->close();
 
}
?>

Vis gaunu klaidą: Fatal error: Call to undefined method PDOStatement::bind_param() in /home/minfas/domains/minfas.us.lt/public_html/srautas/reg.php on line 67.

Neprisijungęs Modestas Vaitkevičius

  • Dalyvis
  • **
  • Įrašai: 2005
  • Karma: +56/-16
    • Žiūrėti profilį
    • Apie mane
Ats: Apsauga nuo sql injection
« Atsakymas #7 Įrašytas: 2013-06-26 20:24:02 pm »
Kokią php versiją naudoji? :)

Neprisijungęs justinas

  • Naujokas
  • *
  • Įrašai: 163
  • Karma: +16/-3
    • Žiūrėti profilį
Ats: Apsauga nuo sql injection
« Atsakymas #8 Įrašytas: 2013-06-26 21:56:16 pm »
Ačiū už pagalba :) Bet jau ilgai vargstu prie kodo:
<?php
if ($insert_user $dbh->prepare("INSERT INTO users (username, email, pass, group) VALUES (?, ?, ?, ?)")) {
 
    
// Bind the variables to the parameter as strings. 
    
$insert_user->bind_param($dbh"ssss"$username$email$pass0);
 
    
// Execute the statement.
    
$insert_user->execute();
 
    
// Close the prepared statement.
    
$insert_user->close();
 
}
?>

Vis gaunu klaidą: Fatal error: Call to undefined method PDOStatement::bind_param() in /home/minfas/domains/minfas.us.lt/public_html/srautas/reg.php on line 67.

Gal dėl to, kad vadinasi ne bind_param, o bindParam? Galioja, berods, visiems PDO metodams – camelCase :)
http://www.php.net/manual/en/pdostatement.bindparam.php

Beje, PDO prepare turi kitokius argumentus, nei mysqli. Tu bandai naudoti kaip mysqli.
« Paskutinį kartą keitė: 2013-06-26 22:45:23 pm sukūrė justinas »

Neprisijungęs Kalnų karalius

  • Naujokas
  • *
  • Įrašai: 104
  • Karma: +0/-0
    • Žiūrėti profilį
Ats: Apsauga nuo sql injection
« Atsakymas #9 Įrašytas: 2013-06-26 23:19:02 pm »
Karaliau, kuo toliau tuo labiau man ant tavęs kyla itarimas :)
<...>
koke dar itarimai? prasom sakyt savo itarimus, o ne kalbėt uzuominomis!
4c61626173212

Neprisijungęs Modestas Vaitkevičius

  • Dalyvis
  • **
  • Įrašai: 2005
  • Karma: +56/-16
    • Žiūrėti profilį
    • Apie mane
Ats: Apsauga nuo sql injection
« Atsakymas #10 Įrašytas: 2013-06-27 07:35:39 am »
Nebekyla :)

ps. Buvo čia vienas žmogus, kuris gavo ban'ą ir tu maždaug kai jam bausmė pasibaigė prisireginai :) O itarimas, nes rašymo manieros tokios pat :) Deja, itariau, bet be reikalo, tad atsiprašau :)

Neprisijungęs minfas

  • Naujokas
  • *
  • Įrašai: 12
  • Karma: +0/-0
    • Žiūrėti profilį
Ats: Apsauga nuo sql injection
« Atsakymas #11 Įrašytas: 2013-06-27 09:11:13 am »
Versija PHP 5.3. Dėl bindparam nežinau, bandžiau rašyt bind_param ir bindParam, bet tas pats. Mačiau vieni vienaip rašo, kiti kitaip...

Neprisijungęs Modestas Vaitkevičius

  • Dalyvis
  • **
  • Įrašai: 2005
  • Karma: +56/-16
    • Žiūrėti profilį
    • Apie mane
Ats: Apsauga nuo sql injection
« Atsakymas #12 Įrašytas: 2013-06-27 09:18:42 am »
Tada turi palaikyti bindParam, tik neaišku kur pas tave bėda :)

Įmesk kodą kaip tu esi parašęs su bindParam :)

Neprisijungęs minfas

  • Naujokas
  • *
  • Įrašai: 12
  • Karma: +0/-0
    • Žiūrėti profilį
Ats: Apsauga nuo sql injection
« Atsakymas #13 Įrašytas: 2013-06-27 09:38:12 am »
dabar gaunu kitokią klaidą: Fatal error: Cannot pass parameter 2 by reference in /home/minfas/domains/minfas.us.lt/public_html/srautas/reg.php on line 67
if ($insert_user = $dbh->prepare("INSERT INTO users (username, email, pass, group) VALUES (:username, :email, :pass, :group)")) {
 
    // Bind the variables to the parameter as strings.
$insert_user -> bindParam(':username', '$username');
    $insert_user -> bindParam(':email', '$email');
$insert_user -> bindParam(':pass', '$pass');
    $insert_user -> bindParam(':group', '0');
 
    // Execute the statement.
    $insert_user->execute();
 
    // Close the prepared statement.
    $insert_user->close();
 
}

Neprisijungęs Modestas Vaitkevičius

  • Dalyvis
  • **
  • Įrašai: 2005
  • Karma: +56/-16
    • Žiūrėti profilį
    • Apie mane
Ats: Apsauga nuo sql injection
« Atsakymas #14 Įrašytas: 2013-06-27 11:07:26 am »
nuo kada reikia dėti tarpus prieš -> ir po???

Neprisijungęs minfas

  • Naujokas
  • *
  • Įrašai: 12
  • Karma: +0/-0
    • Žiūrėti profilį
Ats: Apsauga nuo sql injection
« Atsakymas #15 Įrašytas: 2013-06-27 11:26:15 am »
nuo kada reikia dėti tarpus prieš -> ir po???
Nuėmiau tarpus, bet tapati klaida...

Neprisijungęs justinas

  • Naujokas
  • *
  • Įrašai: 163
  • Karma: +16/-3
    • Žiūrėti profilį
Ats: Apsauga nuo sql injection
« Atsakymas #16 Įrašytas: 2013-06-28 15:32:54 pm »
bindParam() veikia ant reference, o tu paduodi konstantą (kas turbūt nėra reference). Jei tavo bindinamas parametras būtų kintamajame, tada bindParam() galėtų jį paimti kaip reference.

Iš esmės gali tiesiog naudoti bindValue(), kol megabaitinių duomenų netvarkai, vargu, ar bindinti pagal reference turi kokios realios naudos.

Ir dar, jei group yra int, tai ir duok jam int, o ne string. Aišku, MySQL konvertuoja implicitly tokius dalykus, bet niekad nereikia pasitikėt quirkais...

Beje, dar gali tiesiog naudoti execute() su masyvu parametrų. Pasiskaityk http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers , labai padės, o ne vien aklai kopijuok kodą.
« Paskutinį kartą keitė: 2013-06-28 15:40:03 pm sukūrė justinas »

Manualai.lt Forumas

Ats: Apsauga nuo sql injection
« Atsakymas #16 Įrašytas: 2013-06-28 15:32:54 pm »