Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 9 odgovora
  • 3.242 pregleda

Najnovija ↓

php-mysql-manager.php 10.06.2010. u 20:20 · pre 199 meseci
izmenjeno 1 put, poslednji put Cola 10.06.2010. u 20:47
  1. Cola10.06.2010. u 20:47zapis iz teksta poruke
#1
Pozdrav.
Početnik sam u PHP programiranju ali sam ipak se odvažio da radim sajt sa njim pa sam odlučio da napravim sebi par pomoćnih skripti između kojih je i ova za rad sa mySql bazom.
Code:

<?php

    $user="***********";
    $password="***********";
    $database="***********";
    
    function ExecuteQuery($p_query, $p_parametars)
    {
        global $user;
        global $password;
        global $database;
        try 
        {
            $query = $p_query;
            $conn = mysql_connect('localhost', $user, $password) or die( mysql_error());
            if (!$conn) 
            {
                return null;
            }            
            $db_selected = mysql_select_db($database, $conn);
            if (!$db_selected) 
            {
                return null;
            }    
            $query = '';
            $temp = $p_query;
            foreach ($p_parametars as $key => $value) 
            {
                $pKey = "#p" . $key . "#";
                $pos = strpos($temp, $pKey);
                if($pos !== false)
                {
                    // Dio pre parametra stavljamo u query.
                    $query .= substr($temp, 0, $pos);
                    //dodajemo zamjenjen parametar na query.
                    $query .= mysql_real_escape_string($value);
                    //u temp uzimamo ono što je nobrađeno.
                    $temp = substr($temp, $pos + strlen($pKey));        
                }
                else
                {
                    //nije nađen kay $pKey u tempu
                    continue;
                }                
            }
            //ako je nešto preostalo dodajemo na query.
            $query .= $temp;
            return mysql_query($query);            
        }
        catch(Exception $e) 
        {
        }
        return null;
    }    
?>


Naime kako ovo radi, tj koristi se.

Primjer.
Code:

        static function LoginUser($p_username, $p_password)
        {
            $parametars[0] = $p_username;
            $parametars[1] = MD5($p_password);
            $query = "SELECT * FROM Users WHERE username='#p0#' and password='#p1#'";
            $sqlResult = ExecuteQuery($query, $parametars);
            ...


Imao sam na cilj da se na jedinstven način konektujem na bazu, a istovremeno da se ne zamaram stalnom tim djelom koda koji bi se stalno ponavljao.
Gledajući primjere za rešavanje SQL injection mislim da sam ga riješio. jer ako se
pozove
Code:

        LoginUser("Cola's", "test");

dobijem SQL query a sve zahvaljujući funkciji mysql_real_escape_string
Code:

        SELECT * FROM Users WHERE username='Cola\'s' and password='098f6bcd4621d373cade4e832627b4f6'


takođe sam izdvajao parametre da slučajno nebih replejsovao nešto što je korisnik prosledio

Npr. za
Code:

        LoginUser("Co#p1#la's#p1#", "test");

dobijem:
Code:

        SELECT * FROM Users WHERE username='Co#p1#la\'s#p1#' and password='098f6bcd4621d373cade4e832627b4f6'


Ako je ovo dobro imalo drago mi je da to neko iskoristi ali ako ima propusta takođe bi volio da mi ukaže na njih :)

Gdje se na sajtu čuvaju parametri za pristup bazi? Jel nesigurno ovako u fajlu? Ako nije sigurno gde se to inače drži?

Hvala
Potpis
http://www.knjigaimena.com
Re: php-mysql-manager.php 11.06.2010. u 07:36 · pre 199 meseci #2
Nije 100% posto sigurno ali ja ne znam za drugi nacin kako cuvat. Postoje zato "permissions" u MySQL koje mozes dodjelit tom korisniku i definisat sta moze a sta ne raditi na bazi - mada ni to opet nije sigurno u slucaju da imas nekih podataka koji se ne bi smjeli vidjet....

U ovoj funkciji, mislim, da ne valja sto ce se pri svakom query-ju otvarati konekcija ka bazi zato sto si stavio mysql_connect() unutar nje. Radije se konektuj u header/bootscap fajlu, a najbolje kreiraj instancu MySQLi objekta.

Moderatori bi ovo mogli prebacit u PHP za pocetnike ?!

P.S. zasto si napravio bas ovako funkciju sa parametrima ( cemu ovaj drugi parametar ) ?
Re: php-mysql-manager.php 11.06.2010. u 07:55 · pre 199 meseci #3
Ovaj drugi parametar mi služi da u SQL izraz prosledim parametre koji će se zamjeniti, ali sa funkcijom mysql_real_escape_string a ne da se ja time brinem.
tj prosledim parametre one se sve lepo smesti.

Oki hvlala na predlogu moraću da izmestim konektovanje...
Potpis
http://www.knjigaimena.com
Re: php-mysql-manager.php 11.06.2010. u 08:10 · pre 199 meseci #4
A sto nisi onda ovako nesto :)

Code:

function db_query($query)
{
   try
   {
      return mysql_query( mysql_real_escape_string($query) );
   }
  catch(Exception $e) 
  {
  }
  return null;
}
Re: php-mysql-manager.php 11.06.2010. u 10:17 · pre 199 meseci #5
pa nisam tako jer želim da u SQL query-ju ostanu apostrofi koje sam ja definisao

ako ja napišem
Code:

SELECT Ime + '  ' + Prezime FROM Korisnik WHERE KorisnickoIme = '#p0#' 

i prosledim "Cola's"
želim da moji navodnici ostanu tj da izraz izgleda ovako
Code:

SELECT Ime + '  ' + Prezime FROM Korisnik WHERE KorisnickoIme = 'Cola\'s' 

a ne
Code:

SELECT Ime + \'  \' + Prezime FROM Korisnik WHERE KorisnickoIme = \'Cola\'s\' 

ako bi celil SQL query podvrgnuo toj metodi
Potpis
http://www.knjigaimena.com
Re: php-mysql-manager.php 11.06.2010. u 10:59 · pre 199 meseci #6
Code:

static function LoginUser($p_username, $p_password)
        {
            $parametars[0] = $p_username;
            $parametars[1] = MD5($p_password);
            $query = "SELECT * FROM Users WHERE username='#p0#' and password='#p1#'";
            $sqlResult = ExecuteQuery($query, $parametars);
            ...


Moglo je to i bez tih foreach, strpos, substr - samo u gornji kod umjesto sto punis niz $parametars -> primjenit mysql_real_escape_string() na $p_username i $_p_password i dobio bi istu stvar. Onda bi mogao i pozvat obicnu mysql_query() funkciju.
U svakom slucaju dobro je sto mislis na sigurnost baze i sto filtriras podatke dobijene od korisnika. Evo jedan link pa malo procitaj ima dosta dobrih stvari: http://phpsec.org/projects/guide/sr/
Re: php-mysql-manager.php 11.06.2010. u 11:13 · pre 199 meseci #7
Da slažem se da sam mogao odmah to da uradim ali bi za neki sledeći upit takođe morao to da pišem i tako stalno
Naravno ja sam naveo samo jedan primjer a za njega i nema smisla praviti ovakvo nešto.
U projektu ću imati mnogo poziva prema bazi pa da nebi svaki put pisao kod lakše mi je napisati f-iju koja prima parametrizovan upit i parametre.

ideja i jeste bila da:
1. napišem parametrizovan upit
2. napunim parametre (bez da ih ja svaki put mijenjam sa onom funkcijom)
3. pozovem funkciju ExecuteQuery i sve joj to prosledim a ona se pobrine za ostalo (zamjenu parametara, sigurnost i sve ostalo što kasnije još nadogradim na nju a što sam sada propustio)

Hvala za link pregledao sam samo onako površno da vidim čega ima i čini mi se da je dobro, svakako ću ga detaljno prostudirati :)


Potpis
http://www.knjigaimena.com
Re: php-mysql-manager.php 11.06.2010. u 11:30 · pre 199 meseci #8
Meni jedino bode oci onaj try...catch blok. Prvo, nista od tih funkcija ne baca exception. Drugo, cak i da nesto baca exception, try...catch blok obuhvata preveliki komad koda. Evo jednog dobrog teksta o exception-ima http://phpadvent.org/2009/exceptional-php-by-brandon-savage
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme