antonisid Δημοσ. 22 Οκτωβρίου 2015 Δημοσ. 22 Οκτωβρίου 2015 $s_actual_link = filter_var("http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]", FILTER_SANITIZE_URL); $url_parts = parse_url($s_actual_link); parse_str($url_parts['query'], $a_get_vars); extract($a_get_vars); Καλησπέρα, Για κάποιον λόγο η filter_var δε δουλεύει, ή νομίζω ότι δε δουλεύει σε περίπτωση που δε κάνω σωστή χρήση. πχ www.demo.com?company=goo&^%le όταν μετά την extract τυπώσω την μεταβλητή $company θα περιέχει κανονικά ότι περάστηκε στο url: goo&^%le. Είναι απ τις σπάνιες περιπτώσεις που ο συγκεκριμένος τρόπος για να κάνω sanitize τα δεδομένα δεν έχει αποτέλεσμα. Εσείς πως φιλτράρετε τα δεδομένα ενός Url συνήθως?
defacer Δημοσ. 24 Οκτωβρίου 2015 Δημοσ. 24 Οκτωβρίου 2015 Πριν αναρωτηθείς γιατί δε δουλεύει η FILTER_SANITIZE_URL θα ήταν χρήσιμο να διαβάσεις τι κάνει. Sorry for the tough love αλλά είναι η αλήθεια. Επίσης, δεν υπάρχει κανένας απολύτως λόγος να φιλτράρεις URL στη γενική περίπτωση ("πώς φιλτράρετε?" "δε φιλτράρουμε"). Αυτό που πας να κάνεις τι σκοπό έχει;
groot Δημοσ. 25 Οκτωβρίου 2015 Δημοσ. 25 Οκτωβρίου 2015 Εσείς πως φιλτράρετε τα δεδομένα ενός Url συνήθως? Φωτογραφία το url και βάζω κάτι από το instagram. Τόσα φίλτρα έχει! 1
antonisid Δημοσ. 25 Οκτωβρίου 2015 Μέλος Δημοσ. 25 Οκτωβρίου 2015 Πριν αναρωτηθείς γιατί δε δουλεύει η FILTER_SANITIZE_URL θα ήταν χρήσιμο να διαβάσεις τι κάνει. Sorry for the tough love αλλά είναι η αλήθεια. Επίσης, δεν υπάρχει κανένας απολύτως λόγος να φιλτράρεις URL στη γενική περίπτωση ("πώς φιλτράρετε?" "δε φιλτράρουμε"). Αυτό που πας να κάνεις τι σκοπό έχει; The FILTER_SANITIZE_URL filter removes all illegal URL characters from a string. Συνήθως με την mysqli_real_escpape_string (εφόσον χρησιμοποιώ mysqli) ή με τον τρόπο που απομακρύνει του αθέμιτους χαρακτήρες το model που χρησιμοποιώ πχ Eloquent, προστατεύω την βάση από injection και queries. Καθαρά για πειραματισμό ήθελα να διαγράψω τους χαρακτήρες αυτούς ένα στάδιο πριν την διαχείρισή τους, που σημαίνει απευθείας στο Url. Btw τι εννοείς "στην γενική περίπτωση?" Φωτογραφία το url και βάζω κάτι από το instagram. Τόσα φίλτρα έχει! Ειρωνεία - χωρίς λόγο - κι έτσι? Παίξε DnD καλύτερα...μέχρι και ο Σεφερλής είναι πιο αστείος.
groot Δημοσ. 25 Οκτωβρίου 2015 Δημοσ. 25 Οκτωβρίου 2015 Ειρωνεία - χωρίς λόγο - κι έτσι? Παίξε DnD καλύτερα...μέχρι και ο Σεφερλής είναι πιο αστείος. DnD θα παίξω! Thnx. Ειρωνεία δεν ήταν... αλλά μάλλον για να το πάρεις έτσι δείχνει κάτι Cheers. Υ.Γ. Την ειρωνεία πως την κατάλαβε ο μαν; Κληρονομικό χάρισμα - χωρίς λόγο - κι έτσι?
antonisid Δημοσ. 25 Οκτωβρίου 2015 Μέλος Δημοσ. 25 Οκτωβρίου 2015 Υ.Γ. Την ειρωνεία πως την κατάλαβε ο μαν; Κληρονομικό χάρισμα - χωρίς λόγο - κι έτσι? Αυτό που είπες πέρα απ το χιούμορ το οποίο είναι καλοδεχούμενο, το θεώρησα ειρωνικό κυρίως λόγω timing. (ανοίγω θρεντ με τεχνική ερώτηση και μου λες να βγάλω φωτογραφία με το κινητό μου το url και να το φιλτράρω στο Instagram?????? :P ) Εφόσον λες ότι δεν ήταν το δέχομαι. Cheers και καλή κυριακή
defacer Δημοσ. 25 Οκτωβρίου 2015 Δημοσ. 25 Οκτωβρίου 2015 The FILTER_SANITIZE_URL filter removes all illegal URL characters from a string. ...πράγμα το οποίο δε σημαίνει απαραίτητα ότι αφαιρώντας τους illegal URL characters αυτό που θα μείνει θα είναι σωστά δομημένη URL. Για την ακρίβεια, http://php.net/manual/en/filter.filters.sanitize.php FILTER_SANITIZE_URL Remove all characters except letters, digits and $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=. αυτό που συμβαίνει είναι ακριβώς αυτό που θα λέει. Απλά είναι λάθος ο τρόπος με τον οποίο αποκωδικοποίησες αυτό που διάβασες. Οι χαρακτήρες που περιμένεις να αφαιρεθούν είναι valid να εμφανίζονται σε ένα URL και δε γίνεται περαιτέρω έλεγχος για τη σύνταξη. BTW σύμφωνα με τον ορισμό του URL αυτό που γίνεται δεν είναι technically σωστό μιας και στο fragment μέρος επιτρέπονται URL code points που είναι υπερσύνολο του ASCII και περιλαμβάνουν χαρακτήρες τους οποίους η FILTER_SANITIZE_URL κόβει. Συνήθως με την mysqli_real_escpape_string (εφόσον χρησιμοποιώ mysqli) ή με τον τρόπο που απομακρύνει του αθέμιτους χαρακτήρες το model που χρησιμοποιώ πχ Eloquent, προστατεύω την βάση από injection και queries. Καθαρά για πειραματισμό ήθελα να διαγράψω τους χαρακτήρες αυτούς ένα στάδιο πριν την διαχείρισή τους, που σημαίνει απευθείας στο Url. Btw τι εννοείς "στην γενική περίπτωση?" Technically με τη mysqli_real_escape_string και απομακρύνοντας αθέμιτους χαρακτήρες δεν προστατεύεις τίποτα. Η προστασία παρέχεται κάνοντας σωστά quote την είσοδο, και το escaping "απλώς" δεν επιτρέπει στον επίδοξο hacker να βγει από τα quotes. Για την απομάκρυνση αθέμιτων χαρακτήρων (sanitization) πολύ περιληπτικά αυτό που έχω να πω το είπα ήδη, αν κάνεις τα υπόλοιπα σωστά δεν προσφέρει τίποτα (στη γενική περίπτωση) και αν δεν τα κάνεις σωστά δεν είναι από μόνη της αρκετή προστασία. Υπάρχει πολλή λογοτεχνία πάνω στο θέμα, δε χρειάζεται να πιστέψεις εμένα μπορείς να διαβάσεις σχετικά. Την προσέγγιση "να αφαιρέσω τους κακούς χαρακτήρες" τη συναντάω 100 φορές από κάποιον που δεν έχει αρκετή εμπειρία στην ασφάλεια για κάθε 1 που τη συναντάω από κάποιον που πραγματικά ξέρει τι κάνει. Αυτό το τελευταίο είναι η ειδική περίπτωση (vs γενική που αναφέραμε), όπου π.χ. μπορεί να χρησιμοποιείται sanitization γιατί είναι γελοιωδώς εύκολο και δεν κοστίζει απολύτως τίποτα (π.χ. περιμένεις int άρα κάνεις cast την είσοδο σε int) η/και το σύστημα είναι υψηλής αξίας και εσκεμμένα κάνουμε defense in depth στον κώδικα.
antonisid Δημοσ. 26 Οκτωβρίου 2015 Μέλος Δημοσ. 26 Οκτωβρίου 2015 Technically με τη mysqli_real_escape_string και απομακρύνοντας αθέμιτους χαρακτήρες δεν προστατεύεις τίποτα. Η προστασία παρέχεται κάνοντας σωστά quote την είσοδο, και το escaping "απλώς" δεν επιτρέπει στον επίδοξο hacker να βγει από τα quotes. Για την απομάκρυνση αθέμιτων χαρακτήρων (sanitization) πολύ περιληπτικά αυτό που έχω να πω το είπα ήδη, αν κάνεις τα υπόλοιπα σωστά δεν προσφέρει τίποτα (στη γενική περίπτωση) και αν δεν τα κάνεις σωστά δεν είναι από μόνη της αρκετή προστασία. Υπάρχει πολλή λογοτεχνία πάνω στο θέμα, δε χρειάζεται να πιστέψεις εμένα μπορείς να διαβάσεις σχετικά. Την προσέγγιση "να αφαιρέσω τους κακούς χαρακτήρες" τη συναντάω 100 φορές από κάποιον που δεν έχει αρκετή εμπειρία στην ασφάλεια για κάθε 1 που τη συναντάω από κάποιον που πραγματικά ξέρει τι κάνει. Αυτό το τελευταίο είναι η ειδική περίπτωση (vs γενική που αναφέραμε), όπου π.χ. μπορεί να χρησιμοποιείται sanitization γιατί είναι γελοιωδώς εύκολο και δεν κοστίζει απολύτως τίποτα (π.χ. περιμένεις int άρα κάνεις cast την είσοδο σε int) η/και το σύστημα είναι υψηλής αξίας και εσκεμμένα κάνουμε defense in depth στον κώδικα. Ευχαριστώ για την μακροσκελή απάντηση. Η αλήθεια είναι ότι συναντάς την προσέγγιση "αφαιρώ τους κακούς χαρακτήρες" συχνότερα, καθώς - προσωπικά τουλάχιστον - όσα χρόνια δουλεύω ως προγραμματιστής ποτέ δε τέθηκε θέμα ασφάλειας. Ακόμα και σε μεγάλα πρότζεκτς δε χρειάστηκε να επικεντρωθώ πολύ στον τομέα της ασφάλειας, πέραν των βασικών....ίσως λόγο περιορισμένου χρόνου, παράβλεψης κτλ (άλλωστε ποτέ δεν αποφασίζει κάποιος μόνος του πως και που θα κατανεμηθούν οι ώρες όταν η χρέωση γίνεται με την ώρα στον πελάτη) . Anyway....κάπως αντίστοιχα νομίζω θα είναι και στους περισσότερους που έχουν "αναπαυτεί" στην προσέγγιση αυτή. Οπότε κατά την γνώμη σου ποια είναι η ειδική περίπτωση? Ποια μεθοδολογία χρησιμοποιείται πέραν του sanitization? Αν μπορείς να δώσεις κάποια κατεύθυνση ή πηγές θα ταν χρήσιμο. Αναφέρω πηγές καθότι η πλειοψηφία αποτελεσμάτων κατά την αναζήτηση προτείνει λύσεις τύπου mysql_real_escape_string, santization και τα γνωστά, τα οποία χαρακτήρισες "γενική περίπτωση".
defacer Δημοσ. 26 Οκτωβρίου 2015 Δημοσ. 26 Οκτωβρίου 2015 Το να αφαιρέσεις κακούς χαρακτήρες με τρόπο που να έχει αποτέλεσμα προϋποθέτει ότι ξέρεις ποιοί χαρακτήρες είναι "κακοί" και για ποιό λόγο είναι κακοί. Πράγμα το οποίο εξαρτάται από το ποιά θα είναι η έξοδος στην οποία θα οδηγηθούν οι χαρακτήρες. Αλλά αυτό θεωρητικά δε μπορείς να το ξέρεις όταν δέχεσαι είσοδο (στην οποία εφαρμόζεις sanitization). Αν πάλι το ξέρεις, τότε μπορείς εξίσου καλά να κάνεις escape τους κακούς χαρακτήρες κατάλληλα και να μη σε απασχολεί καθόλου η ύπαρξή τους, οπότε και πάλι θεωρητικά το sanitization δεν προσφέρει τίποτα. Και βέβαια σε πολλές περιπτώσεις δε μπορείς να κάνεις και καθόλου sanitization χωρίς να επηρρεάσεις τη λειτουργικότητα (π.χ. σε ένα πεδίο "description") οπότε σα γενική λύση δεν στέκει, σε αντίθεση με το escaping. Στην πράξη τώρα, επειδή λάθη συμβαίνουν και στις καλύτερες οικογένειες, σε κάποιες περιπτώσεις (τις ειδικές) όπου η ασφάλεια είναι critical θα είχε νόημα να "κλείσεις το τάπερ μέσα σε ένα άλλο τάπερ για καλύτερη μόνωση" και ταυτόχρονα να κάνεις και πολλά άλλα πράγματα αφού είμαστε σε μια ειδική περίπτωση. Αυτά όσον αφορά την ασφάλεια. Μπορώ να φανταστώ (και έχω εφαρμόσει ο ίδιος) sanitization σε άλλες περιπτώσεις, στις οποίες όμως δεν έχουμε σα στόχο την ασφάλεια.
NoD Δημοσ. 27 Οκτωβρίου 2015 Δημοσ. 27 Οκτωβρίου 2015 To λεγόμενο sanitization χρησιμοποιείται με τέτοιο τρόπο που τείνει να γίνει anti-pattern. Όπως είπε ο defacer, μην κάνεις sanitize τιποτα, χρησιμοποίησε prepared statements σωστά ( native και όχι emulated), escape τα δεδομένα σου στην έξοδο και είσαι μια χαρά. Η λογική συνήθως είναι ότι δεν πειράζεις το user input αλλά δεν εμπιστεύεσαι είσοδο,/έξοδο επίσης.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα