Απολύμανση εισόδου του χρήστη χρησιμοποιώντας Python

ψήφοι
52

Ποιος είναι ο καλύτερος τρόπος για να αποστειρώνουν είσοδο του χρήστη για μια εφαρμογή web Python-based; Είναι μια ενιαία λειτουργία για να αφαιρέσετε χαρακτήρες HTML και κάθε άλλη αναγκαία χαρακτήρες συνδυασμούς για να αποφευχθεί η εκεί XSS ή επίθεση SQL ένεση;

Δημοσιεύθηκε 19/08/2008 στις 19:18
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
0

Εάν χρησιμοποιείτε ένα πλαίσιο όπως Django , το πλαίσιο μπορεί εύκολα να κάνει αυτό για σας με τη χρήση τυποποιημένων φίλτρων. Στην πραγματικότητα, είμαι αρκετά σίγουρος Django κάνει αυτόματα εκτός και αν σας πω ότι δεν με.

Σε αντίθετη περίπτωση, θα ήθελα να συστήσω χρησιμοποιώντας κάποιο είδος regex επικύρωσης πριν από την αποδοχή εισροές από τις φόρμες. Δεν νομίζω ότι υπάρχει μια μαγική συνταγή για το πρόβλημά σας, αλλά χρησιμοποιώντας τη μονάδα εκ νέου, θα πρέπει να είναι σε θέση να κατασκευάσει ό, τι χρειάζεστε.

Απαντήθηκε 19/08/2008 στις 19:24
πηγή χρήστη

ψήφοι
6

Ο ίδιος ο Jeff Atwood περιγράφεται πώς StackOverflow.com απολυμαίνει είσοδο του χρήστη (σε μη-γλώσσα-συγκεκριμένους όρους) σχετικά με το blog Υπερχείλιση στοίβας: http://blog.stackoverflow.com/2008/06/safe-html-and-xss/

Ωστόσο, όπως ο Justin επισημαίνει, εάν χρησιμοποιείτε πρότυπα Django ή κάτι παρόμοιο, τότε κατά πάσα πιθανότητα απολυμάνετε εξόδου HTML σας έτσι κι αλλιώς.

SQL ένεση, επίσης, δεν θα πρέπει να είναι μια ανησυχία. Όλα βιβλιοθηκών της βάσης δεδομένων της Python (MySQLdb, cx_Oracle, κλπ) απολυμάνετε πάντα τις παραμέτρους που περνάτε. Αυτές οι βιβλιοθήκες που χρησιμοποιούνται από όλους αντικείμενο-σχεσιακή χαρτογράφους Python (όπως τα μοντέλα Django), έτσι ώστε να μην χρειάζεται να ανησυχείτε για την αποχέτευση υπάρχει ούτε.

Απαντήθηκε 19/08/2008 στις 19:51
πηγή χρήστη

ψήφοι
24

Εδώ είναι ένα απόσπασμα που θα αφαιρέσει όλες τις ετικέτες που δεν περιλαμβάνονται στον λευκή λίστα, και όλα ετικέτα δεν αποδίδει στην λευκή λίστα attribues (έτσι δεν μπορείτε να χρησιμοποιήσετε onclick).

Είναι μια τροποποιημένη έκδοση του http://www.djangosnippets.org/snippets/205/ , με την τυπική έκφραση για τις τιμές του χαρακτηριστικού για να αποτρέψει τους ανθρώπους από τη χρήση href="javascript:...", και άλλες περιπτώσεις που περιγράφονται στο http://ha.ckers.org/xss .html .
(π.χ. <a href="ja&#x09;vascript:alert('hi')">ή <a href="ja vascript:alert('hi')">, κ.λπ.)

Όπως μπορείτε να δείτε, να χρησιμοποιεί το (φοβερό) BeautifulSoup βιβλιοθήκη.

import re
from urlparse import urljoin
from BeautifulSoup import BeautifulSoup, Comment

def sanitizeHtml(value, base_url=None):
    rjs = r'[\s]*(&#x.{1,7})?'.join(list('javascript:'))
    rvb = r'[\s]*(&#x.{1,7})?'.join(list('vbscript:'))
    re_scripts = re.compile('(%s)|(%s)' % (rjs, rvb), re.IGNORECASE)
    validTags = 'p i strong b u a h1 h2 h3 pre br img'.split()
    validAttrs = 'href src width height'.split()
    urlAttrs = 'href src'.split() # Attributes which should have a URL
    soup = BeautifulSoup(value)
    for comment in soup.findAll(text=lambda text: isinstance(text, Comment)):
        # Get rid of comments
        comment.extract()
    for tag in soup.findAll(True):
        if tag.name not in validTags:
            tag.hidden = True
        attrs = tag.attrs
        tag.attrs = []
        for attr, val in attrs:
            if attr in validAttrs:
                val = re_scripts.sub('', val) # Remove scripts (vbs & js)
                if attr in urlAttrs:
                    val = urljoin(base_url, val) # Calculate the absolute url
                tag.attrs.append((attr, val))

    return soup.renderContents().decode('utf8')

Όπως οι άλλες αφίσες έχουν πει, λίγο πολύ όλες οι βιβλιοθήκες Python db αναλάβει τη φροντίδα του SQL ένεση, έτσι αυτό θα πρέπει λίγο πολύ να σας κάλυψη.

Απαντήθηκε 24/08/2008 στις 15:08
πηγή χρήστη

ψήφοι
4

Δεν κάνω ανάπτυξης ιστοσελίδων πολύ πια, αλλά όταν το έκανα, το έκανα κάτι σαν αυτό:

Όταν δεν ανάλυσης υποτίθεται ότι θα συμβεί, εγώ συνήθως απλά ξεφύγετε από τα στοιχεία να μην παρεμβαίνει με τη βάση δεδομένων όταν το αποθηκεύετε, και να ξεφύγουν από ό, τι έχω διαβάσει πάνω από την βάση δεδομένων να μην παρεμβαίνει με html όταν το (cgi.escape εμφάνιση () στο Πύθων).

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

Με λίγα λόγια πάντα ξεφύγουν από αυτό μπορεί να επηρεάσει την τρέχουσα στόχο για τα δεδομένα.

Όταν έκανα χρειάζονται κάποια parsing (σήμανση ή οτιδήποτε άλλο) Συνήθως προσπάθησε να κρατήσει τη γλώσσα σε μη τεμνόμενες που με html έτσι θα μπορούσα ακόμα απλά να το αποθηκεύσετε κατάλληλα διέφυγε (μετά την επικύρωση για σφάλματα σύνταξης) και να αναλύσει το σε html κατά την εμφάνιση χωρίς χρειάζεται να ανησυχείτε για τα δεδομένα του χρήστη βάλει εκεί παρεμβαίνει html σας.

Δείτε επίσης Ξεφεύγοντας HTML

Απαντήθηκε 24/08/2008 στις 15:23
πηγή χρήστη

ψήφοι
12

Ο καλύτερος τρόπος για την πρόληψη XSS δεν είναι να προσπαθήσουμε και να φιλτράρετε τα πάντα, αλλά να κάνουμε απλά HTML Οντότητα κωδικοποίηση. Για παράδειγμα, ενεργοποιείται αυτόματα <σε & lt ;. Αυτή είναι η ιδανική λύση αν υποτεθεί ότι δεν πρέπει να δεχθεί οποιαδήποτε είσοδο html (εκτός φόρουμ περιοχών / σχόλιο όπου χρησιμοποιείται ως σήμανση, θα πρέπει να είναι αρκετά σπάνιο να πρέπει να αποδεχθούν HTML)? υπάρχουν τόσες πολλές παραλλαγές με εναλλακτικές κωδικοποιήσεις που κάθε άλλο παρά μια εξαιρετικά περιοριστική λίστα επιτρεπόμενων (az, AZ, 0-9 για παράδειγμα) πρόκειται να αφήσουμε κάτι μέσα.

SQL Injection, σε αντίθεση με άλλες απόψεις, εξακολουθεί να είναι δυνατή, αν είστε λίγο κτίριο από μια σειρά ερωτημάτων. Για παράδειγμα, αν είστε λίγο συνένωση σε μια εισερχόμενη παράμετρο σε μια σειρά ερωτημάτων, θα έχετε SQL Injection. Ο καλύτερος τρόπος για την προστασία από αυτό, επίσης, δεν το φιλτράρισμα, αλλά να χρησιμοποιούν θρησκευτικά παραμετροποιημένη ερωτήματα και ΠΟΤΕ ενώσετε παρέμβαση του χρήστη.

Αυτό δεν σημαίνει ότι το φιλτράρισμα δεν είναι ακόμα καλύτερη πρακτική, αλλά από την άποψη της SQL Injection και XSS, θα είναι πολύ πιο προστατευμένη εάν θρησκευτικά χρησιμοποιήσετε παραμετροποιήσετε Ερωτήματα και HTML Οντότητα Κωδικοποίηση.

Απαντήθηκε 18/09/2008 στις 14:56
πηγή χρήστη

ψήφοι
20

Επεξεργασία : χλωρίνη είναι ένα περιτύλιγμα γύρω από html5lib που καθιστά ακόμη πιο εύκολο στη χρήση ως λευκή λίστα με βάση το απολυμαντικό.

html5libέρχεται με μια λευκή λίστα με βάση το απολυμαντικό HTML - είναι εύκολο να την υποκατηγορία για να περιορίσει τις ετικέτες και χαρακτηριστικά οι χρήστες έχουν τη δυνατότητα να χρησιμοποιήσετε στο site σας, και ακόμη προσπαθεί να απολυμάνετε CSS, αν είστε επιτρέποντας τη χρήση του styleχαρακτηριστικού.

Εδώ τώρα είμαι το χρησιμοποιείτε Υπερχείλιση στοίβας μου κλώνο του sanitize_htmlσυνάρτηση χρησιμότητας:

http://code.google.com/p/soclone/source/browse/trunk/soclone/utils/html.py

Έχω ρίξει όλες τις επιθέσεις που αναφέρονται στο XSS Cheatsheet ha.ckers.org του (που είναι επιδέξια διαθέσιμο σε μορφή XML σε αυτό μετά την εκτέλεση Markdown για τη μετατροπή HTML με τη χρήση python-markdown2 και φαίνεται να έχει καθυστερήσει εντάξει.

Το συστατικό editor τα όπλα μαζικής καταστροφής που χρησιμοποιεί σήμερα Stackoverflow είναι ένα πρόβλημα, αν και - Έπρεπε πραγματικά να απενεργοποιήσετε την Javascript για να ελέγξετε τις επιθέσεις XSS Cheatsheet, όπως επικόλληση όλα αυτά σε όπλα μαζικής καταστροφής που έληξε μέχρι που μου έδωσε κουτιά συναγερμού και τα τυφλά τη σελίδα.

Απαντήθηκε 29/10/2008 στις 23:41
πηγή χρήστη

ψήφοι
2

Για να αποστειρώνουν μια είσοδο στοιχειοσειράς που θέλετε να αποθηκεύσετε στη βάση δεδομένων (για παράδειγμα το όνομα του πελάτη) θα πρέπει είτε να διαφύγει ή απλά αφαιρέστε κάποια εισαγωγικά (»«) από αυτό. Αυτό αποτρέπει αποτελεσματικά την κλασική ένεση SQL που μπορεί να συμβεί αν οι συναρμολόγησης ενός ερωτήματος SQL από χορδές πέρασε από το χρήστη.

Για παράδειγμα (αν είναι αποδεκτό να αφαιρέσετε εισαγωγικά εντελώς):

datasetName = datasetName.replace("'","").replace('"',"")
Απαντήθηκε 01/10/2009 στις 11:21
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more