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

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

Δημοσ.

Καλησπέρα. Φτιάχνω ένα site custom με codeigniter (κάτι σαν πελατολόγιο) για έναν γνωστό. Το site μέχρι ένα σημείο έχει ολοκληρωθεί και στο θέμα κρυπτογράφησης φυλάω με hash όλους τους κωδικούς στην βάση και όλες οι σελίδες μου είναι προσβάσιμες μόνο σε logged in κατάσταση.

Επειδή όμως θα έχει λίγο ευαίσθητο περιεχόμενο μέσα (και κείμενο και 1 φώτο), Αυτά που προκύπτουν όμως είναι τα εξής :

α) Εγώ που θα έχω πρόσβαση στην βάση ώς τεχνικός αλλά δεν θέλω να έχω πρόσβαση στα δεδομένα, παρά μόνο ο γνωστός μου, μπορώ να κάνω να περνιούνται όλα στην βάση hash? Γίνεται αυτό? Υπάρχει κάποιος άλλος τρόπος?

β.1) Η φωτογραφία (ταυτότητα) του κάθε πελάτη ανοίγει με  λινκ από σελίδα που μόνο ο γνωστός μπορεί να την δει. Το filename των φωτογραφιών το περνάω από μια παράμετρο encrypted του CI και βγαίνει ένα μακρυνάρι του στυλ dfkjh4fkbnjw4ujbfbwkb4sdg.jpg. Στο folder των φωτογραφιών έχω βάλει ένα κενο index.html για να μην φαίνονται οι υπόλοιπες αν κάποιος μπει στο φάκελο. Αυτό εμποδίζει και μία μηχανή αναζήτησης να μπεί?

β.2.) Αν ενόσω είμαι συνδεδεμένος ανοίξω μια εικόνα σε μία νέα καρτέλα (δηλαδή μάθω το url) και μετά κάνω paste αυτό το url σε άλλο browser  ή incognito χωρίς να είμαι συνδεδεμένος, βλέπω την φωτογραφία κανονικά. Έπαιξα λίγο με τα permision του φακέλου αλλά ότι αλλαγή έκανα επηρέαζε το ίδιο είτε ήμουν συνδεδεμένος, είτε όχι.

  • 4 εβδομάδες αργότερα...
Δημοσ.

α) Όχι. Το hash δεν αποκρυπτογραφείται και έτσι δεν θα υπάρχει τρόπος να εμφανίσει τα δεδομένα εκεί που πρέπει. Θα πρέπει να τα κρυπτογραφείς με ένα κοινό κλειδί.

β1)

Στις 1/2/2020 στις 10:31 ΜΜ, hdonoblepsias είπε

Αυτό εμποδίζει και μία μηχανή αναζήτησης να μπεί?

Όχι απαραίτητα. Όπως είδες ο ίδιος και αναφέρεις πιο μετά, τα αρχεία φαίνονται κανονικά. Αν υπάρχει σύνδεσμος κάπου αλλού (πχ ένας χρήστης ποστάρει ένα url κάπου δημόσια, η μηχανή αναζήτησης θα δει το αρχείο και μπορεί να το εμφανίζει σε αποτελέσματα).

β 1 + 2) Θα πρέπει να κόψεις εντελώς την πρόσβαση στο φάκελο αυτό και να εμφανίζεις τα δεδομένα από script που θα ελέγχει τα κριτήρια σύνδεσης των χρηστών και αν έχουν δικαίωμα θα τους εμφανίζει το αρχείο.

Δημοσ. (επεξεργασμένο)

Αν τρέχει σε apache, μπορείς να μπλοκάρεις την πρόσβαση με ".htaccess". Φτιάχνεις δλδ απλά ένα αρχείο κειμένου με όνομα .htaccess (στο φάκελο που θέλεις να μπλοκάρεις) και αυτό για περιεχόμενο:

Order Allow,Deny 
Deny from all 

Αν δεν τρέχει σε apache κάνε μια αναζήτηση για το server σου και block directory access (πχ "nginx block directory access") ή πες ποιος είναι να βοηθήσουμε εδώ.

Τώρα για το script. Δεν γνωρίζω το codeigniter καθόλου για να σου πω αλλά με php χωρίς χρήση του api του codeigniter:

<?php

if ( $_SESSION['loggedin'] == true ) # Έλεγχος επισκέπτη/χρήστη αν έχει κάνει σύνδεση ( εδώ θα πρέπει να δεις πως δουλεύει το framework σου για να δεις πως θα ελέγξεις για κριτήρια σύνδεσης.
{
  
  $fname = 'διαδρομή_προς_το_φάκελο/' . $_GET['file']; # Αν πούμε ότι θα χρησιμοποιήσεις /?file=<ονομα_αρχειου>
  
}
else
{
  
  $fname = "διαδρομή/σε/εικόνα"; # Εδώ βάζεις διαδρομή σε μια εικόνα που θα πληροφορεί ότι ο χρήστης δεν έχει πρόσβαση ή το αρχείο που ζητάει δεν υπάρχει.
  
}

header ( "Content-type: " . mime_content_type ( $fname ) ); # Έλεγχος και αποστολή του τύπου mime του αρχείου για να γνωρίζει ο browser τι θα προβάλει.

echo file_get_contents( $fname ) ; # Αποστολή του αρχείου στον χρήστη.

?>

Θα επιστρέψω προς το βράδυ για να δω πως μπορεί να γίνει με το framework.

--- edit ---

Αν υποθέσουμε πως το script είναι στο root με όνομα "secretpic.php" τότε θα χρησιμοποιείς το url http://todomainsou/secretpic.php?file=dfkjh4fkbnjw4ujbfbwkb4sdg.jpg για να προβάλεις τη φωτογραφία.

Επεξ/σία από elvizakos
  • 2 εβδομάδες αργότερα...
Επισκέπτης
Δημοσ.

Να πω τη γνώμη μου.

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

Στη συνέχεια θα έβαζα headers για img  και θα έκανα include την εικονα

 

Δες το λίγο έτσι

Δημοσ. (επεξεργασμένο)

Επέτρεψέ μου να παρέμβω στην χρήση του Codeigniter (βγαίνοντας ελαφρών offtopic). Προσωπικά παρόλο που το έχω χρησιμοποιήσει και είδα ότι στην αρχή είναι εύκολο γρήγορα γίνετε messy ο κώδικας αυτού ειδικά σε μη έμπειρα χέρια. Ακόμη το Codeigniter ΔΕΝ χρησιμοποιεί prepared statements αλλά με Drop in replacement των ? σε queries άρα αρκετά ευπαθές σε SQL Injection. Τέλος το hash των passwords να είναι Salted Bcrypt. Τέλος έλεγξε ότι η έκδοση του codeginter παίζει με maintained εκδοση της php από την επίσημη κοινότητα: https://www.php.net/supported-versions.php ακόμη χρησιμοποίησε την τελευταία έκδοση του codeigniter ή χρόνου επιτρέποντος άλλο framework.

Having said that επεκτείνοντας την ιδέα του @elviz και ο @gekatsouσου συστήνω το εξής:

  1. Ο φάκελος πoυ γίνετε upload να είναι κρυπτογραφημένος σε επίπεδο λειτουργικού. Σε περίπτωση cloud storage αξιοποίησε το encryption αυτού.
  2. Το φόρτωμα των εικόνων να γίνετε από custοm router το οποίο θα ελέγχει το session.
  3. Ακόμα o router θα ελέγχει και τον browser header και έαν δεν είναι header ενός browser αλλά ενός bot/spider να τρώει 403 Forbitten. Δηλαδή μην φέρνεις το content μέσω nginx/apache αλλά μέσω php. Αργό λόγο php αλλά safe αρκεί η εικόνα να είναι εικόνα και όχι malicious content.
  4. Το content της εικόνας να έρχετε μέσω file_cet_contents η fread αντί για include

Σε μεγάλο scale μπορείς να κάνεις σε ξεχωριστό project έναν φορτωτή εικόνων σε nodejs που απλά να ελέγχει ένα jwt που γίνετε issued κατά το login. Σε αυτήν την περίπτωση το url των εικόνων μπορεί αν έχει την μορφή: https://images.example.com/image.jph?token=jwt_token

Το issuing των jwt token θα εμπεριέχει στο playload μια cryptographically secure random τιμή που θα αποθηκεύετε σε μια κοινή λίστα  μεταξύ site και φορτωτή των εικόνων (nodejs project) κατά το login του χρήστη. Ειδάλλως μπορεί να είναι η μια default encrypted τιμή που θα είναι standart μεταξύ webtite και nodejs και website. Ακόμη το nodejs project θα πρέπει να δίνει άκυρο (403 forbitten) σε http headers bot.

Μια εναλλακτική λύση είναι η χρήση signed urls και CDN που να λαμβάνει τις εικόνες μέσω CDN η custom implementation:

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

Ίσως, να βολεύει απλά να αποθηκεύεις τον αριθμό ταυτότητας ή διαβατηρίου και η κρυπτογράφηση να γίνετε σε επίπεδο βάσης με τους εξής τρόπους:

  • Επικοινωνία βάσης <-> website  μέσω SSL.
  • Τα δεδομένα της βάσης να είναι κρυπτογραφημένα.
  • Προεραιτικά η βάση (infrastructure επιτρέποντος) να επιτρέπει συγγεκριμένες ip και να είναι σε private network. Οι webserver να έχουν 2 ip μια public και μια private. Στις private διευθύνσεις να επιτρέπονται μόνο οι συνδέσεις προς την βάση και καμία άλλου σύνδεση μέσω firewall.

Τέλος να σημειώσω ότι το αποθηκεύεις ταυτότητα κάνει την εργασία σου ποιο ακριβή και τον γνωστό σου υπεύθυνο για τα δεδομένα των πελατών του (GDPR Says so).

Επεξ/σία από PC_MAGAS

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

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

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

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

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

Σύνδεση

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

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