Προς το περιεχόμενο

insert σε βαση postgresql


slevinkelevra

Προτεινόμενες αναρτήσεις

Καλησπερα και πάλι, θα χρειαστω τη βοηθεια σας για μια ακομα φορα.

 

Χρησιμοποιω postgreSQL 9.1 και postGIS 2.0.

Θελω να κανω ενα απλο INSERT σε εναν πινακα, το οποιο για καποιο λογο δικο του, αρνηται να δουλεψει.

 

Τσεκαρα τη συνδεση μου στη βαση, εχω δωσει τα καταλληλα δικαιωματα στον χρηστη γ αυτον τον πινακα, τσεκαρα μια και το manual της 9,1 και δεν βλεπω καποιο προβλημα η διαφορα...

 

Οριστε και ο κωδικας, αν μπορειτε καπως να βοηθησετε...

<?php
//τραβαμε data απο τη φορμα, δε τα χω βαλει ολα προφανως, για συντομια

$pass = $_POST['pass'];
$name = $_POST['name'];

//crypt it up!
$hashed_password = crypt($pass);

//ας συνδεθουμε - εδω επελεξα να "κρυψω" τα σημαντικα με αστερακια - στον δικο μου κωδικα τα εχω συμπληρωσει ΚΑΝΟΝΙΚΑ
$connh = pg_connect("host=**** port=**** dbname=**** user=**** password=****")or die('Λυπούμαστε αλλά προσωρινά, δεν μπορείτε να συνδεθείτε στη βάση δεδομένων. Παρακαλούμε προσπαθήστε ξανά αργότερα');		
	
$query="INSERT INTO controller (c_name, passwrd) VALUES ($name, $hashed_password)";

pg_query($connh,$query);

//ξαναγυρνα πισω στη φορμα  
header('Location: accountThree.php');

?>

Αυτο ειναι το αρχειο, δεν εχω βαλει κατι αλλο, ειναι ενα πολυ απλο testing αρχειο, δεν εχει αλλο κωδικα , functions, includes αλλα αρχεια, τιποτα...Τι ακριβως φταιει? Μηπως το crypting? Δοκιμασα και χωρις crypting, να κανω INSERT μονο το name, και παλι τιποτα.

 

Καμια ιδεα?

 

Ευχαριστω πολυ...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πιθανόν να θέλει κι άλλα δικαιώματα ο χρήστης... Αυτό ήταν το μόνο πρόβλημα που είχα αντιμετωπίσει και εγώ με postresql. Α και ένα θέμα με πολλαπλά insert σε ένα query.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αφού δεν βάζεις τα strings ανάμεσα σε εισαγωγικά στο query πώς να δουλέψει; Επίσης κάνεις και 2 ακόμα πράγματα που δεν πρέπει: πρώτον βάζεις το $name κλπ κατευθείαν από τη φόρμα στο query (άρα ανοίξαμε και σας περιμένουμε για sql injection attack) και δεύτερον χρησιμοποιείς την crypt() χωρίς να καθορίζεις το salt, η οποία δεν είναι ικανοποιητική από πλευράς ασφάλειας λύση.

 

Αντιμετωπίζεις το SQL injection και το πρόβλημά σου ταυτόχρονα χρησιμοποιώντας την pg_escape_literal:

 

$query= sprintf(
    "INSERT INTO controller (c_name, passwrd) VALUES (%s, %s)",
    pg_escape_literal($name),
    pg_escape_literal($hashed_password));

Δεν έχω βάλει μόνος μου εισαγωγικά γιατί η pg_escape_literal τα βάζει μόνη της (διάβασε το manual οπωσδήποτε).

 

Για το hashing των passwords: http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ΟK σας ευχαριστω ολους. Εβαλα και αυτακια...


Το προβλημα δεν λυθηκε ομως! Πρεπει να αλλαξω , στο αρχειο, το connect
 

 

$connh = pg_connect //κτλ κτλ
 

 

 


 (το user και password) και να βαλω τα στοιχεια του default superuser της βασης για να δουλεψει. Τσεκαρα τη

βαση μου, στην pgAdmin στο "δεντρο" αριστερα, στα login roles οι users της βασης που εφτιαξα εγω (με create

user κτλ) ειναι εκει. Αν κανω δεξι κλικ στους πινακες > properties > privileges οι χρηστες ειναι εκει και τα

δικαιωματα τους, πχ μονο select ή select και update αναλογα ...Τι μπορει να εγινε? Η να εκανα? Παλι απο την

αρχη τους χρηστες ε? Αλλα και παλι, ενα απλο select μπορουν να το κανουν.

Οταν επιλεγω εναν χρηστη απο το login roles στα properties που εμφανιζει , το "Update catalogs" ειναι No. Αυτο

φταιει? Χαθηκα...


@defacer χρησιμες οι συμβουλες σου , το link για την bcrypt το χω δει κ γω. Σε

Link.png Site: http://php.net/manual/en/function.crypt.php">αυτό το link ομως αναφερει οτι "If no salt is provided,

PHP will auto-generate either a standard two character (DES) salt, or a twelve character (MD5), depending on

the availability of MD5 crypt()." Γι αυτο αφηνω το password "ανάλατο". Btw αν ψαξεις για bcrypt σε πεταει

κατευθειαν στην crypt πλεον.


Επισης η δομη των αρχειων μου εχει ως εξης : loginForm.php η φορμα, με post τα περναμε στο loginchecker

οπου πρωτα εχουμε τον παρακατω κωδικα και μετα τσεκαρουμε στη βαση


 

 

  $log = trim($log); 
$pass = trim($pass); 
$log = stripslashes($log); 
$pass = stripslashes($pass);
 $log = pg_escape_string($log); 
$pass = pg_escape_string($pass);
 

 

 

 οποτε νομιζω οτι ειμαι καλυμμενος στο θεμα injection.Η μηπως οχι? Για πες..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Νομίζω θα ήσουν καλύτερα χρησιμοποιώντας PDO με prepared statements, για να είσαι ασφαλής.

 

Απότι είχα δει και παλιότερα, στο λινκ του Defacer, απο 5.5 θα έχουμε τις password_hash & password_verify, οπότε για την ώρα χρησιμοποιώ την 

function blowfishCrypt($password,$cost)
{
    $chars='./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $salt=sprintf('$2a$%02d$',$cost);
//For PHP >= PHP 5.3.7 use this instead (as per martinstoeckli's suggestion)
//    $salt=sprintf('$2y$%02d$',$cost);
    //Create a 22 character salt -edit- 2013.01.15 - replaced rand with mt_rand
    mt_srand();
    for($i=0;$i<22;$i++) $salt.=$chars[mt_rand(0,63)];
    return crypt($password,$salt);
}
Example:

$hash=blowfishCrypt('password',10); //This creates the hash
$hash=blowfishCrypt('password',12); //This creates a more secure hash
if(crypt('password',$hash)==$hash){ /*ok*/ } //This checks a password

 

που δίνουνε στις επόμενες απαντήσεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

$log = trim($log); 
$pass = trim($pass); 
$log = stripslashes($log); 
$pass = stripslashes($pass);
$log = pg_escape_string($log); 
$pass = pg_escape_string($pass);
 

 

οποτε νομιζω οτι ειμαι καλυμμενος στο θεμα injection.Η μηπως οχι? Για πες..

 

Βασικά εσύ πες για ποιό λόγο νομίζεις ότι είσαι καλυμμένος. Συγκεκριμένα θα μ' ενδιέφερε πολύ να μου εξηγήσεις γιατί έβαλες stripslashes.

 

Γενικά, είτε έχεις συγκροτημένη άποψη "είμαι καλυμμένος γιατί Χ Υ Ζ" ή αλλιώς απλά γράφεις random κώδικα που δεν ξέρεις αν/γιατί  δουλεύει και δε χρειάζεται βέβαια να σου πω εγώ αν γενικά είσαι καλυμμένος σε τέτοιες περιπτώσεις.

 

Spoiler: αν και ο κώδικας που δε δείχνεις είναι σωστός τότε ναι είσαι καλυμμένος, αλλά α) η stripslashes είναι bug και β) χρησιμοποιείς μια function της οποίας η τεκμηρίωση λέει "να μην προτιμάται η χρήση της". Γιατί έτσι; Τι έπρεπε να λέει δηλαδή για να μην τη χρησιμοποιήσεις;

 

Μη μπερδέψεις σε παρακαλώ το ύφος μου με κράξιμο.

 

Και τέλος, για την crypt αυτό που θέλεις είναι να χρησιμοποιήσεις είναι τα salts που θα το γυρίσουν σε blowfish, δηλαδή κάτι του στυλ

 

crypt($password, "$2y$05$salt.salt.salt.salt.sa")

Όπου το μέρος μετά το τελευταίο $ είναι ακριβώς 22 random χαρακτήρες με περιορισμούς που αναφέρονται στο manual. Αυτό δηλαδή ακριβώς που δίνει ο Malibu παραπάνω μόνο που $2y$ είναι καλύτερα από $2a$.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν δεν το κάνεις και σου πάρουν τη database = pwnd ή μάλλον MONSTER PWND αν είσαι μεγάλο site, γιατί μάντεψε αν οι χρήστες σου θα έχουν χρησιμοποιήσει τα ίδια pair από username και password σε άλλα sites.

 

Όπου βέβαια "σου πάρουν τη database" = ακόμα και με ένα απλό injection σε SELECT κιόλας τον ήπιες άνετα χωρίς να χρειαστεί ούτε καν να μπορεί να γράψει ο άλλος τίποτα στη βάση. Απλά φαντάσου ότι εκεί που έχεις

 

SELECT user, pass FROM users WHERE ... 

 

με το injection σου το κάνουν

 

SELECT user, pass FROM users WHERE (ποτέ) UNION SELECT user, pass FROM users LIMIT n, 1

 

Εντάξει θα μου πεις άντε και έκανες random login σιγά το pwnage, ούτε password δεν πήρες.

 

SELECT user, pass FROM users WHERE (ποτέ) UNION SELECT pass, user FROM users LIMIT n, 1

 

Welcome <?php echo $row['user']; ?>, you have been logged in.

 

Pwnd.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι, ωραια. Μπαινει χακερ και σου παιρνει την βαση. Αυτος ο χακερ που σου αρπαξε την βαση, δεν μπορει μαζι με τηνβαση να παρει και το register.php ;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τι τι θα καταλαβει; Εαν δεις αυτο

$pass = ...;

$key= "Bazw Random Kye Ha ha ha";

superduperCryptoAlgEncrypt($pass,$key);

 

 

Εσυ μετα πολυ απλα δεν θα μπορουσες να βαλεις

superduperCryptoAlgDecrypt($encPass,"Bazw Random Key Ha ha ha");

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Wow, κόσμε, ας ηρεμησουμε λιγο και ας κανουμε ενα διάλλειμα. Ειναι μαλλον προφανες οτι ειμαι rookie γ'αυτο δωστε μου λιγο χρονο.

For starters ευχαριστω ολους για τις απαντησεις. Defacer δεν παρεξηγω το υφος κανενος (ακομα και οντως να εκραζες, κατι ψιλιαζομαι τουλαχιστον).

 

Τρια πραματα προς το παρων και τα υπολοιπα αφου ξανατσεκαρω τα παντα.

 

1-defacer, που λεει οτι η stripslashes ειναι bag? γενικα εχω διαβασει πριν βαλω κατι στον κωδικα μου, αλλα αυτο μου ξεφυγε. Δεν πουλαω μουρη, απλα αν εχεις κανα link στειλτο να το δω και γω να χαμπαριασω.

 

2-παπί, σύντροφε, οκ, δεν εχει νοημα να cryptαρω server side. τι αντιπροτεινεις ειναι το θεμα μου...(again, δεν πουλαω μουρη)

 

3-First things first...Nα θυμησω οτι εφαγα κομπλα με τους users και παροτι τους δηλωσα κτλ κτλ δεν μπορουν να κανουν insert, εκτος αν δηλωσω στο connection μου οτι ειμαι default superuser? Καμια ιδεα επ αυτου?

 

Και παλι ευχαριστω αλανια, περισσοτερες ειδησεις αυριο, πουρνο πουρνο γιατι τωρα δεν την παλευω να τα ξαναδω

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

2) Δεν εχω να αντιπροτεινω κατι, ουτε βγαινει τετοιο νοημα απο αυτα που γραφω. Απορια το'χω, ημαρτον, τι να κανω; να ανοιξω αλλο νημα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...