Python kullanarak kullanıcı girişi Sanitising

oy
52

Python tabanlı web uygulaması için kullanıcı girişi sterilize etmenin en iyi yolu nedir? Bir engellemek için HTML karakterleri ve diğer gerekli karakterler kombinasyonları kaldırmak için bir tek işlevi var mı XSS veya SQL enjeksiyon saldırısı?

Oluştur 19/08/2008 saat 19:18
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
0

Eğer böyle bir çerçeve kullanıyorsanız django , çerçeve kolayca standart filtre kullanarak sizin için bunu yapabilirsiniz. Öyle olmadığını söylememiş sürece Aslında, oldukça emin Django değilim bunu otomatik olarak yapar.

Aksi takdirde, ben formlardan girdileri kabul etmeden önce regex doğrulama çeşit kullanarak öneriyoruz. Ben senin sorunu için gümüş kurşun var sanmıyorum, ama yeniden modülünü kullanarak, size ne gerek inşa gerekir.

Cevap 19/08/2008 saat 19:24
kaynak kullanıcı

oy
6

Jeff Atwood kendisi StackOverflow.com yığın taşması blogda (non-dile özgü açısından) kullanıcı girişi sterilize anlattı: http://blog.stackoverflow.com/2008/06/safe-html-and-xss/

Justin işaret ettiği gibi Django şablonlar veya ona benzer bir şey kullanırsanız, ancak, daha sonra muhtemelen yine HTML çıktısını sterilize.

SQL enjeksiyonu da bir endişe olmamalı. Python'un veritabanı kütüphaneleri (vb MySQLdb, cx_Oracle,) hepsi her zaman geçmesine parametreleri sterilize. Bu kütüphaneler (örneğin Django modelleri gibi) Python'un nesne ilişkisel haritacıları herkes tarafından kullanılmaktadır, yani oraya ya sanitasyon konusunda endişelenmenize gerek yoktur.

Cevap 19/08/2008 saat 19:51
kaynak kullanıcı

oy
24

(Böylece kullanamaz Burada beyaz listede olmayan tüm etiketleri kaldırır pasajıdır ve tüm etiket attribues beyaz listenizde olmayan nitelikleri onclick).

Bu değiştirilmiş bir versiyonu http://www.djangosnippets.org/snippets/205/ kullanarak engellemek için özellik değerleri üzerinde regex ile, href="javascript:..."ve diğer durumlarda adresinde açıklanan http://ha.ckers.org/xss .html .
(örneğin, <a href="ja&#x09;vascript:alert('hi')">ya da <a href="ja vascript:alert('hi')">, vs.)

Gördüğünüz gibi, bu (müthiş) kullanan BeautifulSoup kütüphanesi.

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')

Diğer posterleri söylediler, hemen hemen bütün Python db kütüphaneleri, SQL enjeksiyonu özen, bu nedenle bu should hemen hemen kapak sen.

Cevap 24/08/2008 saat 15:08
kaynak kullanıcı

oy
4

Ben çok artık bir web geliştirme yapmak yok, ama ben yaptım, ben şöyle bir şey yaptım:

Hiçbir ayrıştırma gerçekleşmesi gerekiyordu zaman saklayın zaman, genellikle sadece veritabanı ile sekteye uğratmamak için verileri kaçmak ve in) (Ben (cgi.escape görüntülediğinizde html sekteye uğratmamak için ben veritabanından okumak şeyi kaçış piton).

Birisi giriş html karakter veya malzeme çalıştıkları takdirde Şansı, aslında o zaten metin olarak görüntülenecek aranıyor. Eğer onlar :) iyi zor

Kısacası her zaman veri için geçerli hedefini etkileyebilir neler kaçmak.

Bazı ayrıştırma (işaretlemeyi ya da herneyse) ihtiyaç Ne zaman genellikle de o dili tutmaya çalıştı olmayan bir kesişen olmadan gösterirken html yüzden ben hala (sözdizimi hataları için doğrulayarak sonra) o uygun kaçmış depolamak ve bunu ayrıştırmak olabilir seti html veriler hakkında orada html'nizin müdahale koymak kullanıcıyı dert.

Ayrıca bkz HTML kaçıyor

Cevap 24/08/2008 saat 15:23
kaynak kullanıcı

oy
12

XSS önlemenin en iyi yolu denemek ve her şeyi filtre değil, sadece HTML Varlık kodlama yapmak için değil. Örneğin, otomatik olarak ve LT ;. içine <edecek Bu (o biçimlendirme olarak kullanıldığı nerede HTML kabul etmeleri gerekmektedir oldukça nadir olmalı, forum / yorum alanlarının dışında) herhangi bir html girişini kabul etmek gerekmez varsayarak ideal bir çözümdür; ultra kısıtlayıcı beyaz listeye (az, AZ, örneğin 0-9) bir şey ama içinden bir şeyler izin gidiyor alternatif kodlamalar yoluyla pek çok permütasyon vardır.

Eğer sadece bir sorgu dizesi okullara yardımcı olmak, diğer görüşüne aykırı SQL Injection, hâlâ mümkündür. Eğer sadece bir sorgu dizesi üzerine gelen bir parametre birleştirerek eğer Örneğin, SQL Injection sahip olacaktır. Buna karşı korumanın en iyi yolu da filtreleme değildir, daha ziyade dini parametreli sorguları kullanmak ve kullanıcı girişi bitiştirmek ASLA için.

Bu filtrelemenin hala iyi bir uygulama değildir, ancak dini Parameterize Sorgular ve HTML Varlık Kodlama kullanırsanız SQL Enjeksiyon ve XSS açısından da bu kadar korumalı olacak demek değildir.

Cevap 18/09/2008 saat 14:56
kaynak kullanıcı

oy
20

Düzenleme : ağartıcı daha da kolay bir beyaz liste tabanlı sanitasyonunda olarak kullanmak için yapan html5lib etrafında sarıcı.

html5libBir beyaz liste tabanlı HTML sanitasyonunda ile geliyor - bu etiketleri kısıtlamak için alt sınıf kolaydır ve kullanıcıların sitenizde kullanmak için izin verilen nitelikleri ve hatta kullanımına izin veren eğer CSS sterilize dener styleözniteliği.

İşte şimdi benim yığın taşması klonu içinde kullanıyorum var sanitize_htmlfayda fonksiyonu:

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

Ben listelenen tüm saldırıları atılan ettik ha.ckers.org XSS Pardus dezavantaj vardır ( XML formatında mevcut kullanarak HTML dönüşüm Markdown gerçekleştirdikten sonra ona piton-markdown2 ve Tamam kaldırdı gibi görünüyor.

Stackoverflow anda kullandığı KİS editör bileşeni olsa bir sorundur - Aslında bana uyarı kutuları veren KİS içine hepsini sona erdi yapıştırarak ve sayfayı boşaltılıyor olarak, XSS Pardus saldırıları sınamak için JavaScript devre dışı zorunda kaldı.

Cevap 29/10/2008 saat 23:41
kaynak kullanıcı

oy
2

Eğer ondan ( "') Herhangi bir tırnak kaldırmak açıkça ondan kaçmak veya yapmalı ya (örneğin bir müşteri adı için) veritabanına kaydetmek istediğiniz bir dize girişi dezenfekte. Bu etkin eğer başına gelebilecek klasik SQL enjeksiyon önler kullanıcı tarafından geçirilen dizeleri bir SQL sorgusu araya geliyorlar.

Örneğin, (tamamen tırnak kaldırma olarak uygun ise):

datasetName = datasetName.replace("'","").replace('"',"")
Cevap 01/10/2009 saat 11:21
kaynak kullanıcı

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