sinikos Δημοσ. 25 Ιουνίου 2021 Δημοσ. 25 Ιουνίου 2021 Καλησπέρα. Θέλω να προστατεύσω το path των φωτογραφιών από μη συνδεδεμενους χρήστες. Δηλαδή αν χτυπήσει κάποιος site.gr/images/photo1.jpg, αν είναι συνδεδεμένος, να μπορεί να την δει. Αν βαλει κάποιος όμως που δεν ειναι συνδεδεμένος το path site.gr/images/photo1.jpg να μην μπορεί να δει εικόνα. Βρήκα μια λύση στο stackoverflow και έφτιαξα ένα controller Showimages <?php defined('BASEPATH') OR exit('No direct script access allowed'); class Showimages extends CI_Controller { function show($image_filename) { $img_path = base_url()."assets/privateimages/".$image_filename; $fp = fopen($img_path,'rb'); header('Content-Type: image/png'); header('Content-length: ' . filesize($img_path)); fpassthru($fp); } Και εκεί που θέλω να εμφανίσω την φωτογραφία, έχω <img class="img-fluid" style="margin:10px" src="<?php echo base_url('showimages/show/'.$image->image)?>" width="1000"> Η φωτογραφία δείχνει σπασμένη όμως και αν πατήσω ανοιγμα εικόνας σε νέα καρτέλα, μου βγάζει ένα άσπρο τετραγωνάκι Υ.Γ. Εννοείται οτι στο παραπάνω controller θα βάλω τις συνθήκες του authorization. Απλά είμαι ακόμα στο τεστ της εμφάνισης της εικόνας.
Επισκέπτης Δημοσ. 25 Ιουνίου 2021 Δημοσ. 25 Ιουνίου 2021 (επεξεργασμένο) Με μια Class και ένα function base_url δεν βγάζω νόημα για να απαντήσω. function show($image_filename) { $img_path = base_url()."assets/privateimages/".$image_filename; $fp = fopen($img_path,'rb'); header('Content-Type: image/png'); header('Content-length: ' . filesize($img_path)); fpassthru($fp); } <?php If($have_access) show('img1.png'); // Όπου $have_access bool αν έχει γίνει authorization του user ?> Αυτο φτάνει νομίζω. συγνώμη γράφω από το κινητό. Επεξ/σία 25 Ιουνίου 2021 από Επισκέπτης ...
sinikos Δημοσ. 26 Ιουνίου 2021 Μέλος Δημοσ. 26 Ιουνίου 2021 (επεξεργασμένο) 16 ώρες πριν, gekatsou είπε Με μια Class και ένα function base_url δεν βγάζω νόημα για να απαντήσω. function show($image_filename) { $img_path = base_url()."assets/privateimages/".$image_filename; $fp = fopen($img_path,'rb'); header('Content-Type: image/png'); header('Content-length: ' . filesize($img_path)); fpassthru($fp); } <?php If($have_access) show('img1.png'); // Όπου $have_access bool αν έχει γίνει authorization του user ?> Αυτο φτάνει νομίζω. συγνώμη γράφω από το κινητό. Νομίζω οτι εσύ εννοείς στην php που εμφανίζεται η φώτο. Εκεί το έχω κάνει. Χωρίς auth δεν βλέπεις τίποτα. Να εξηγήσω ποιο αναλυτικά ποιο είναι το πρόβλημά μου. Έστω οτι υπάρχει μια σελίδα στο site μου site.gr/gallery. Αυτός που έχει auth να δει την σελίδα μπαίνει κανονικά (το συνδεδεμένο μέλος, το premium μέλος κλπ. Δεν μας αφορά αυτό). Αυτός που δεν έχει δικαιώματα, δεν μπορεί να μπει στην σελίδα. ΌΛΑ ΚΑΛΑ ΜΕΧΡΙ ΕΔΩ Αν όμως ένας που έχει δικαιώματα πάει πάνω στην εικόνα και πατήσει "άνοιγμα εικόνας σε νέα καρτέλα" θα του ανοίξει η εικόνα σε νέα καρτέλα με path πχ site.gr/images/photo1.jpg Αν αυτή την εικόνα την στείλει σε κάποιον που δεν έχει δικαιώματα, αυτός ο κάποιος μπορεί να την ανοίξει κανονικά. Αν το μέλος που έχει δικαιώματα, κάποια στιγμή δεν έχει (πχ γιατί έληξε η premium συνδρομή), Αν έχει κρατήσει κάπου το url site.gr/images/photo1.jpg, πάντα θα έχει πρόσβαση στην φωτογραφία. Αυτό που προσπαθώ να κάνω με το παραπάνω τρόπο, αλλά για κάποιο λόγο δεν μου δουλεύει, είναι να προσπαθώ να προστατεύσω το original path. Δηλαδή αν ο οποιοσδήποτε πατήσει άνοιγμα εικόνας σε νέα καρτέλα αντί για site.gr/images/photo1.jpg το url να είναι site.gr/showimages/show/photo1.jpg. Και φυσικά μέσα από το controller showimages, περνάω το auth που θέλω -> Αυτό προσπαθώ να υλοποιήσω <-. *Ακόμα δεν έχω πειράξει κάτι στο .htaccess (Το αναφέρω για να μην νομίζετε οτι παίζει κάποιο πρόβλημα εκεί.) Επεξ/σία 26 Ιουνίου 2021 από sinikos
Ponous Δημοσ. 27 Ιουνίου 2021 Δημοσ. 27 Ιουνίου 2021 Δεν κατάλαβα καλά ποιο είναι το πρόβλημα σου, ότι δεν φορτώνει η εικόνα ή πως δεν δουλεύει σωστά το auth? Όπως και να έχει θα απαντήσω και στα δύο. Όσο αφορά το auth: Εγώ προσωπικά θα κρατούσα ένα uuid (με σταθερό id δεν δουλεύει) και θα έβαζα το uuid στο url κάθε φορά που κάνω share την εικόνα. Έτσι το link θα έμοιαζε έτσι site.gr/images/f2166a3a-aad3-4345-8f77-25c2abeb19bf/photo1.jpg Έτσι εσύ κάθε φορά θα ελέγχεις αν ο χρήστης που έχει το uuid εκείνο έχει τα απαραίτητα δικαιώματα για να δει την εικόνα Ως επίσης καλή ιδέα είναι αντί να έχεις το filename, να κρατάς ένα μοναδικό όνομα της εικόνας (εμένα μου αρέσει να χρησιμοποιώ την συνάρτηση time για τέτοιου είδους θέματα). Τα υπόλοιπα μέτρα ασφαλείας τα εξηγεί και στο stackoverflow για το πως να προστατέψεις τον φάκελο που περιέχει τις εικόνες (εδώ αν κατάλαβα σωστά ακόμα δεν δοκίμασες κάτι) Όσο αφορά την εικόνα που λες πως δεν εμφανίζεται σωστά: Μου μοιάζει για codeigniter αλλά δεν ξέρω να το χρησιμοποιώ. Η εντολή fpassthru που χρησιμοποιείς όμως πιθανόν να σου δημιουργεί κάποια προβλήματα για αρχεία μεγαλύτερα των 5mb. Σύμφωνα με τον τύπου εδώ χρειάζεσαι και την εντολή ob_end_clean για να δουλέψει Για αρχή πες μας κατά πόσο δουλεύει ο πιο κάτω σύνδεσμος και τι εμφανίζει... και μετά κατά πόσο δουλεύει στο src: base_url('showimages/show/'.$image->image) Ελπίζω να βοήθησα.
sinikos Δημοσ. 29 Ιουνίου 2021 Μέλος Δημοσ. 29 Ιουνίου 2021 (επεξεργασμένο) Στις 27/6/2021 στις 5:00 ΜΜ, Ponous είπε Δεν κατάλαβα καλά ποιο είναι το πρόβλημα σου, ότι δεν φορτώνει η εικόνα ή πως δεν δουλεύει σωστά το auth? Όπως και να έχει θα απαντήσω και στα δύο. Μέχρι τώρα φόρτωνα τις εικόνες στο src με κανονικό path. Μιλάμε για εκατοντάδες εικόνες. Οταν λοιπόν ο οποιοσδήποτε βλέπει το path της εικόνας, "site.gr/images/photo1.jpg, site.gr/images/photo2.jpg κλπ.' μπορεί να το αποθηκέυσει και να το στείλει οπουδήποτε. Αν ξαφνικά τον διαγράψω από μέλος, σαφέστετατα δεν θα μπορεί να συνδεθεί, δεν θα μπορεί να δει τις σελίδες που χρειάζονται authentication, αλλά πάντα αν χτυπάει site.gr/images/photo1.jpg θα μπορεί να ανοίξει την εικόνα. Αναφορά σε κείμενο Όσο αφορά το auth: Εγώ προσωπικά θα κρατούσα ένα uuid (με σταθερό id δεν δουλεύει) και θα έβαζα το uuid στο url κάθε φορά που κάνω share την εικόνα. Έτσι το link θα έμοιαζε έτσι site.gr/images/f2166a3a-aad3-4345-8f77-25c2abeb19bf/photo1.jpg Έτσι εσύ κάθε φορά θα ελέγχεις αν ο χρήστης που έχει το uuid εκείνο έχει τα απαραίτητα δικαιώματα για να δει την εικόνα Θα την ψάξω στην λύση που λες αλλά αφού δεν βγάλω άκρη με την λύση του controller γιατί με μπερδέυει κάπως Ως επίσης καλή ιδέα είναι αντί να έχεις το filename, να κρατάς ένα μοναδικό όνομα της εικόνας (εμένα μου αρέσει να χρησιμοποιώ την συνάρτηση time για τέτοιου είδους θέματα). Μοναδικό όνομα έχω. Το photo1, photo2 που γράφω κλπ είναι για το παράδειγμα που γράφω εδώ. Κανονικά είναι του στυλ 3267-25634634-545345-6546.jpg και υπάρχει και το time μέσα για την μοναδικότητα. Τα υπόλοιπα μέτρα ασφαλείας τα εξηγεί και στο stackoverflow για το πως να προστατέψεις τον φάκελο που περιέχει τις εικόνες (εδώ αν κατάλαβα σωστά ακόμα δεν δοκίμασες κάτι) Αυτό θα το κάνω σε δευτερο στάδιο. Πρέπει πρώτα να δουλέψει το controller όπως θέλω. Όσο αφορά την εικόνα που λες πως δεν εμφανίζεται σωστά: Μου μοιάζει για codeigniter αλλά δεν ξέρω να το χρησιμοποιώ. Η εντολή fpassthru που χρησιμοποιείς όμως πιθανόν να σου δημιουργεί κάποια προβλήματα για αρχεία μεγαλύτερα των 5mb. Σύμφωνα με τον τύπου εδώ χρειάζεσαι και την εντολή ob_end_clean για να δουλέψει Ναι. Codeigniter είναι. Δοκίμασα και την παραπάνω λύση αλλά δεν μου δούλεψε. Θα ξαναπροσπαθήσω. Για αρχή πες μας κατά πόσο δουλεύει ο πιο κάτω σύνδεσμος και τι εμφανίζει... και μετά κατά πόσο δουλεύει στο src: base_url('showimages/show/'.$image->image) Δυστυχώς δεν εμφανίζει τίποτα. Το σπασμένο icon αρχείου δείχνει. Δοκίμασα να βάλω και στο url του browser το path, με καρφωτό το αρχείο, δηλαδή site.gr/showimages/show/photo1.jpg αλλά τίποτα. Να επισημάνω οτι στο παραπάνω controller δοκίμασα να κάνω και ένα echo το $img_path, μήπως και έκανα καμιά βλακεία στα path αλλά είναι σωστά το πραγματικό url της εικόνας Ελπίζω να βοήθησα. εντωμεταξυ εχω δοκιμάσει αρκετές λύσεις αλλά τίποτα δεν δουλεύει. https://stackoverflow.com/a/23462616 Επεξ/σία 29 Ιουνίου 2021 από sinikos
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα