θέματα ασφαλείας της mysql και php

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Άβαταρ μέλους
nikirtsi
Δημοσιεύσεις: 169
Εγγραφή: 02 Ιουν 2006 16:35

θέματα ασφαλείας της mysql και php

Δημοσίευση από nikirtsi » 30 Σεπ 2006 23:30

Αρχικώς συγνώμη γιά τήν επιμονή μού εις τό θέμα...

Panosru....

Τά Quotes κατά τήν Mysql είναι υποχρεωτικά μόνον εις τίς αλφαριθμιτικές αξίες όπου αναφέρονται ώς ορίσματα ενός ερωτήματος...

Η χρήσις τών Quotes εις τά ονόματα τών πεδίων ή ακόμα καί εις τά ονόματα τών πινάκων δίδετο μόνον ΚΑΙ μόνον γιά νά μπορεί νά έχει υπόσταση κάτι σάν καί αυτό

SELECT 'select' FROM 'from' WHERE 'where' = x

Ώς γνωστόν όμως η PHP κάνει Backslash αντικατάστασι τού χαρακτήρος ' (Quote) όπου προέρχετε έκ μεθόδον Get,Post. επομένως έχει μιά βάσιν αυτό πού λες...


Όμως ξανα-αναφέρω πώς η ίδια η PHP έχει λύσει τό πρόβλημα τών SQL Injections



Π.χ έστω τό ερώτημα SELECT 1 FROM tbl WHERE Id = x
Έστω ότι η τίμη x προερχετο εκ' χρήστη καί όπως βλέπετε δέν έχει Quotes...


Άν τώρα ο χρήστης ορίσει
χ = 1; DROP TABLE tbl;
πολύ απλά ο πίνακας tbl δέν θά διαγραφή γιατί γίνετε αντικατάστασις καί τού ΚΕΝΟΥ...
όχι άμεσα από τήν PHP αλλά από αυτό πού αποκαλλούμε UrlEnCode
Ακόμα και ο ήλιος, στό αριστερό μελίγγι μου ανατέλλει καί στό ζερβό δύει.

Άβαταρ μέλους
nikirtsi
Δημοσιεύσεις: 169
Εγγραφή: 02 Ιουν 2006 16:35

θέματα ασφαλείας της mysql και php

Δημοσίευση από nikirtsi » 01 Οκτ 2006 00:16

Σωστώς Αλέξανδρε...

Πάντα καταδίκασα κατί σάν καί αυτό
mysql_query "SELECT * FROM tbl" on error catch mysql_error()

τό Sqlca είναι κάτι τό οποίον δέν έχει σχέσι μέ τόν τελικό χρήστη αλλά καί εμφανίζει μέρος τής δομής τής βάσεως...

Σχετικά επί αυτού εις τόν τόπο
http://seclists.org/bugtraq/2006/Sep/0328.html
Ακόμα και ο ήλιος, στό αριστερό μελίγγι μου ανατέλλει καί στό ζερβό δύει.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

θέματα ασφαλείας της mysql και php

Δημοσίευση από panosru » 01 Οκτ 2006 02:31

an exeis ena query tou typou

SELECT * FROM users WHERE username = $_POST['username'] AND password = $_POST['password']

tote thn ekanes file mou

an ego sta fields sou grapso

USERNAME: asd
PASSWORD: asd or 1=1

eimai mesa sto systhma

to query tha prepei na graftei sosta etsi:

$sql = "SELECT * FROM `users` WHERE `username` = '".addslashes($_POST['username'])."' AND `password` = '".addslashes($_POST['password'])."' LIMIT 1";

Episeis h php den exei lysei tpt apo monh ths des ta Magic Quotes ths php..

Episeis, kalo einai na kaneis mutte @ alla prepei na kratas ola ta error sou se mia variable kai se kathe oloklhrosh tou fortomatos ths selidas na ta grafeis se logfile des thn error_log

EDIT:
Episeis, an grapseis mysql_query "SELECT * FROM tbl" on error catch mysql_error() to mono pou tha deis einai:
Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING

:D
Τελευταία επεξεργασία από το μέλος panosru την 01 Οκτ 2006 02:40, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

θέματα ασφαλείας της mysql και php

Δημοσίευση από cpulse » 01 Οκτ 2006 02:39

Δεν διάβασα το thread από την αρχή.. αλλά τα escapes (mysql_escape_string() και mysql_real_escape_string()) χρειάζονται αν δεν είναι ενεργοποιημένα τα magic quotes!!

Κώδικας: Επιλογή όλων

function safe_escape($input) {
  if (get_magic_quotes_gpc()) return $input;
  if (function_exists('mysql_real_escape_string')) return mysql_real_escape_string($input, $GLOBALS['db_handle']);
  if (function_exists('mysql_escape_string')) return mysql_escape_string($input);
  return addslashes($input);
}
Δεν έχω τεστάρει τον κώδικα γιατί δουλεύω με άλλους τρόπους.. το έγραψα για να βοηθήσω την συζήτηση, αλλά σε αυτό τον κώδικα θα πρέπει να υπάρχει ένα global variable $db_handle που θα είναι το αποτέλεσμα του mysql_connect().

Όσο για το mysql_error() .. αντίθετα με τον nikirtsi εγώ προτείνω να χρησιμοποιείται οπωσδήποτε γιατί αλλιώς δεν θα υπάρχει τρόπος να βρίσκουμε τα λάθη μας. Αν δεν θέλουμε προβλήματα καλό θα ήταν να τεστάρουμε τα script μας πριν τα παραδώσουμε, και το ακόμα καλύτερο να υπάρχει ένα function που στον χρήστη λέει οτι έγινε ένα λάθος χωρίς να λέει λεπτομέρειες και το πραγματικό λάθος να γράφεται σαν εσωτερικό μήνυμα προς τον admin.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

θέματα ασφαλείας της mysql και php

Δημοσίευση από panosru » 01 Οκτ 2006 02:42

basika aleksi to @ fysika enoeite pos to bazeis afou testareis olo to script kai eisai apolyta sigouros alla tha mou peis pote den eisai sigouros ;)

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

θέματα ασφαλείας της mysql και php

Δημοσίευση από cpulse » 01 Οκτ 2006 02:49

Όχι!.. ούτε @.. γιατί υπάρχει και η περίπτωση του "too many connections" ή του "out of memory" .. χρειάζεται κι ας μας δείχνει κακούς προγραμματιστές. Καλύτερα να ξέρουμε τι γίνεται και να διορθωνόμαστε.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

θέματα ασφαλείας της mysql και php

Δημοσίευση από panosru » 01 Οκτ 2006 02:54

den diafono, bebaia omos einai kai o tropos pou programmatizei o kath' enas, ego genikotera apofeygo na ferno ton pelath se epafh me ta errors epidi oi prisoteroi den kseroun kai tromazoun. protimo se periptosh dysleitourgias na bgalo ta mutes kai na do ego ta errors. bebaia sebasth h apopsiso kai isos kai kalyterh mias kai se glytonei me apo diplo kopo alla opos eipa den eimaste oloi idioi ;)

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

θέματα ασφαλείας της mysql και php

Δημοσίευση από cherouvim » 01 Οκτ 2006 09:28

Με το @ αγνoείς το λάθος. Καλύτερα είναι στο live site να έχουμε error_reporting(0); και κατά το development error_reporting(E_ALL);

Ο άλλος τρόπος είναι να θέσουμε το δικό μας error handler ο οποίος θα μας ειδοποιεί με e-mail (η οτιδήποτε άλλο) όταν κάτι συμβεί. Το error μπορεί να logάρεται με log4php σε αρχείο, DB, email, win NT error log κτλ.

nikirtsi έγραψε:Π.χ έστω τό ερώτημα SELECT 1 FROM tbl WHERE Id = x
Έστω ότι η τίμη x προερχετο εκ' χρήστη καί όπως βλέπετε δέν έχει Quotes...

Άν τώρα ο χρήστης ορίσει
χ = 1; DROP TABLE tbl;
πολύ απλά ο πίνακας tbl δέν θά διαγραφή γιατί γίνετε αντικατάστασις καί τού ΚΕΝΟΥ...
όχι άμεσα από τήν PHP αλλά από αυτό πού αποκαλλούμε UrlEnCode
To query δεν θα εκτελεστεί γιατί η MySQL επιστρέφει SQL syntax error. Καμία σχέση δεν έχουν τα extra spaces στα SQL queries, όπως και το URLencode. Μπορεί ο client να δεί %20 στο URL για κάθε κενό, αλλά στην PHP/MySQL θα φτάσει το " " (space).
panosru έγραψε:... WHERE `id` = '{$id}'...

me single quotes dld, me ayton ton tropo mporoume na apofygoume tyxon SQL Injections
Με αυτό το τρόπο δεν αποφεύγεις sql injections. Για sql injections πρέπει να εξαφανίζεις, αντικαθιστάς ή να κάνεις escape τους ύποπτους χαρακτήρες από το user input. Αν για παράδειγμα ο χρήστης έδινε 1' or 'foo'='foo, θα έκανε το query σου τρέξει για όλα τα rows του table (είτε αυτό ήταν SELECT, DELETE... κτλ).

mysql_real_escape_string

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

θέματα ασφαλείας της mysql και php

Δημοσίευση από panosru » 01 Οκτ 2006 12:57

cherouvim έγραψε:Αν για παράδειγμα ο χρήστης έδινε 1' or 'foo'='foo, θα έκανε το query σου τρέξει για όλα τα rows του table (είτε αυτό ήταν SELECT, DELETE... κτλ).
etsi tha ebaze slashes sta single quotes mia kai xrhsmopoihsa to addslashes() kai den tha ektelouse ton kodika.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

θέματα ασφαλείας της mysql και php

Δημοσίευση από cherouvim » 01 Οκτ 2006 13:35

addslashes? Δεν το είπες αυτό στο post σου.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

θέματα ασφαλείας της mysql και php

Δημοσίευση από panosru » 01 Οκτ 2006 13:45

Ma afou egrapsa...
panosru έγραψε:
[...]

to query tha prepei na graftei sosta etsi:

$sql = "SELECT * FROM `users` WHERE `username` = '".addslashes($_POST['username'])."' AND `password` = '".addslashes($_POST['password'])."' LIMIT 1";

[...]
EDIT:
Apla den eksighsa ton logo pou ta ebala epidi htan h ora tetoia kai ekana kai douleia me to ena mati idi na klhnei :P

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

θέματα ασφαλείας της mysql και php

Δημοσίευση από cherouvim » 01 Οκτ 2006 14:13

Αυτό που μου δίχνεις τώρα έρθει 2 μέρες μετά το μήνυμα που έγραψες πάνω στο οποίο σου απάντησα. Μιλούσαμε για security και χωρίς να αναφέρεις τίποτα είπες ότι το id='$id' σε γλυτώνει από τα injections.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

θέματα ασφαλείας της mysql και php

Δημοσίευση από panosru » 01 Οκτ 2006 14:18

aaa esy les gia to allo to post pou eixa kanei poio prin.. nai exeis dikio gi' ayto kai ekana neo post ksana.

Άβαταρ μέλους
nikirtsi
Δημοσιεύσεις: 169
Εγγραφή: 02 Ιουν 2006 16:35

θέματα ασφαλείας της mysql και php

Δημοσίευση από nikirtsi » 01 Οκτ 2006 16:05

Τά λόγια πάντα θά είναι λόγια......
Καί οί διαφωνίες πάντα θά προκαλούν σύγχυση...

Λοιπόν προκαλώ κάποιον νά φτιάξει μία test Db...
Καί μέσω μίας σελίδος νά εκτελεί ένα ερώτημα ακόμα καί τής πιό απλής μορφής
SELECT * FROM tbl WHERE field = 1 (οπού τό x θά τό δίνει ο χρήστης)

Καί νά δημοσιεύσει εις τόν εξής τόπο τήν διεύθυνσιν τής σελίδος
καθώς επίσσης καί τό σχήμα τής βάσεως...

Όχι γιά κανέναν άλλο λόγο ,
αλλά ούτε καί γιά νά αποδείξουμε τό ποιος από εμάς είναι εντέλει ο πιό εγωιστής...

Μόνον καί μόνον γιά νά καταλήξουμέ κάπου γιά τό χάος τών απόψεων
περί τού θέματος....
Ακόμα και ο ήλιος, στό αριστερό μελίγγι μου ανατέλλει καί στό ζερβό δύει.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

θέματα ασφαλείας της mysql και php

Δημοσίευση από panosru » 01 Οκτ 2006 16:55

oriste

PS: ta monosylaba den tonizontai (symbouli filika panta)

EDIT:
bash den xreiazese gia to paradigma den exei kai kamia diafora ti me bash ti me xoris bash apla na deis pos bgainei to query

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης