Šta je novo?

Php/MySql projekat, par pitanja

Serbianboss

Čuven
Učlanjen(a)
07.01.2005
Poruke
1,864
Poena
660
Radim jedan mali projekat za fax, medjutim posto nemam mnogo iskustva sa php/my sql trebaju mi neke informacije.

U pitanju je izmisljeni sajt za automobile. Znaci administrator se loguje na svoj account i ima mogucnost da dodaje nove slike automobila, opis o kolima itd.

Cilj te mini web aplikacije je bezbednost.

Za pocetak sam napravio registration, login, log out forme kao i restricted strane.

Posto je akcenat na zastiti, za pocetak kako te forme da testiram na sql injection?

Inace aplikaciju pravim u Dreamweaveru CS4 i koristim vec gotov kod koji dreamweaver izgenerise.

Ovo je ceo kod koji je izgenerisao za stranicu login:

Kod:
<?php require_once('Connections/registracija.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

mysql_select_db($database_registracija, $registracija);
$query_rsLogin = "SELECT username, password FROM registracija";
$rsLogin = mysql_query($query_rsLogin, $registracija) or die(mysql_error());
$row_rsLogin = mysql_fetch_assoc($rsLogin);
$totalRows_rsLogin = mysql_num_rows($rsLogin);
?>
<?php
// *** Validate request to login to this site.
if (!isset($_SESSION)) {
  session_start();
}

$loginFormAction = $_SERVER['PHP_SELF'];
if (isset($_GET['accesscheck'])) {
  $_SESSION['PrevUrl'] = $_GET['accesscheck'];
}

if (isset($_POST['username'])) {
  $loginUsername=$_POST['username'];
  $password=$_POST['password'];
  $MM_fldUserAuthorization = "";
  $MM_redirectLoginSuccess = "success.php";
  $MM_redirectLoginFailed = "not.php";
  $MM_redirecttoReferrer = false;
  mysql_select_db($database_registracija, $registracija);
  
  $LoginRS__query=sprintf("SELECT username, password FROM registracija WHERE username=%s AND password=%s",
    GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text")); 
   
  $LoginRS = mysql_query($LoginRS__query, $registracija) or die(mysql_error());
  $loginFoundUser = mysql_num_rows($LoginRS);
  if ($loginFoundUser) {
     $loginStrGroup = "";
    
    //declare two session variables and assign them
    $_SESSION['MM_Username'] = $loginUsername;
    $_SESSION['MM_UserGroup'] = $loginStrGroup;	      

    if (isset($_SESSION['PrevUrl']) && false) {
      $MM_redirectLoginSuccess = $_SESSION['PrevUrl'];	
    }
    header("Location: " . $MM_redirectLoginSuccess );
  }
  else {
    header("Location: ". $MM_redirectLoginFailed );
  }
}
?>

Okacicu i bazu. Trenutno u njoj je samo jedna tabela registracija sa poljima Username(PK), password, status.
Okacio sam i login.php stranicu
 

Prilozi

Poslednja izmena:
neki komentar?

Cilj mi je samo da testiram formu na sql injection. Bazu sam okacio kako bi videli tabelu i kolone.
Znaci koji sql injection kod ubaciti i kako?
 
mysql_real_escape_string bi trebao da ti napravi siguran unos za mysql_query, i s'obzirom da se koristi u funkciji GetSQLValueString trebalo da bi da imas safe query, nisam bas preterano detaljno iscitao code, ali otprilike sql injection ovde nije moguc 🙂

http://www.php.net/mysql_real_escape_string

i obicno se koristi kripcija/hash (tipa md5) za password kada se unosi u mysql, kolko vidim u toj login scripti se ne koristi, vec se koristi plain text password iz baze.
 
Poslednja izmena:
da li moze onda nekako taj password kasnije da se procita. Tacnije da ga nekako desifrujem ako bude potrebe.
 
MD5 je jednosmerni kripter tako da ne moze a i inace smatram da ne bi ni trebalo da si u mogucnosti da gledas ljudima password.
 
Teorijski moze nekom od brute-force metoda koji umeju da potraju i nisu potpuno pouzdani, a MD5 za razliku od ostalih nije enkripcija, nego daje samo checksum ulaznog stringa sto ce reci da u bazu snimis MD5(password_in_plaintext), pa kad se neko loguje odradis "SELECT username, password..." i onda obican string compare tipa:
Kod:
if( $username_iz_baze==$_POST['username_iz_forme'] && $password_iz_baze==md5($_POST['password_iz_forme']) ) {
  /* procedura za logovanje */
} else {
  /* pogresno korisnicko ime i/ili sifra */
}
Ovo je naravno uprosceno posto treba odraditi i konverziju u stringove i spreciti mysql injection.
Sustina je da tebe ne treba da zanimaju sifre korisnika i ne treba da ih znas i ne treba da postoji nacin da se iste procitaju iz baze tako da ako neko nekako i dodje do baze ne moze da pokrade sifre. Ako se desi da neko zaboravi sifru, uvek imas apssword reset mehanizme gde ti izgenerises neki slucajni md5(string) za privremeni login i posaljes na registrovani email. E sad, ako je neko vec dosao do baze lako ce da promeni email odredjenog korisnika i da resetuje sifru, ali se bazi obicno teze pristupa direktno i generalno to je ideja vezana za MD5 😀
 
Poslednja izmena:
Nazad
Vrh Dno