Bir foruma giriş kaçmak için doğru / güvenli yolu nedir?

7 Cevap php

Ben php ve mysql arka uç kullanarak bir forum yazılımı oluşturmak ve forum için kullanıcı girişi kaçmak için en güvenli yolu nedir bilmek istiyorum duyuyorum.

I Htmlentities () ve strip_tags () ve htmlspecialchars'dan () ve mysql_real_escape_string () hakkında bilmek ve hatta javascript kaçış () ama nereye kullanmak ve hangi bilmiyorum.

Ne girdi bu üç farklı (işlemiyle, ben bir veritabanına kaydetmek, almak anlamına ve ekran) işlemek için güvenli bir yol olacaktır:

  1. (Ayrıca URL permalink temeli olacaktır) bir yazının bir başlık.
  2. Temel metin girişine sınırlı bir forum sonrası içeriği.
  3. Html sağlayan bir forum sonrası içeriği.

I would appreciate an answer that tells me how many of these escape functions I need to use in combination and why. Thanks!

7 Cevap

HTLM çıktı üretilirken (like you're doing to get data into the form's fields when someone is trying to edit a post, or if you need to re-display the form because the user forgot one field, for instance), muhtemelen kullanmak htmlspecialchars : it will escape <, >, ", {[ediyorum (5)]}, ve & - seçeneklerine bağlı olarak bunu vermek.

strip_tags will remove tags if user has entered some -- and you generally don't want something the user typed to just disappear ;-)
At least, not for the "content" field :-)


Once you've got what the user did input in the form (ie, when the form has been submitted), you need to escape it before sending it to the DB.
That's where functions like mysqli_real_escape_string become useful : they escape data for SQL

You might also want to take a look at prepared statements, which might help you a bit ;-)
with mysqli - and with PDO

Senin gibi bir şey kullanmamalısınız addslashes: Bu veritabanı motoru bağlı değildir etmez kaçan; Bu motor (MySQL, PostGreSQL, ...) ile çalışıyoruz uyan bir işlevi kullanmak için daha güvenli / iyidir: bu nasıl kaçmak için tam olarak ne biliyor, ve edeceğiz.


Son olarak, bir sayfa içinde verileri görüntülemek için:

  • HTML içermemelidir alanlar için, kullanmak gerekir htmlspecilchars: kullanıcı girişi HTML etiketlerini yaptıysam, o olduğu gibi görüntülenir ve HTML olarak enjekte olmayacaktır.
  • for fields that can contain HTML... This is a bit trickier : you will probably only want to allow a few tags, and strip_tags (which can do that) is not really up to the task (it will let attributes of the allowed tags)
    • Sen HTMLPUrifier adında bir araç bakmak isteyebilirsiniz: Eğer izin verilmelidir hangi etiketleri ve nitelikleri belirtmek sağlayacak - ve bu ^ ^ her zaman güzel geçerli HTML üretir
    • Bu hesaplamak için biraz zaman alabilir, ve muhtemelen her zaman görüntülenecek sahip olduğu HTML yeniden oluşturmak istemiyorum; böylece veritabanında depolama hakkında düşünmek (either only keeping that clean HTML, or keeping both it and the not-clean one, in two separate fields -- might be useful to allow people editing their posts ? )


Those are only a few pointers... hope they help you :-)
Don't hesitate to ask if you have more precise questions !

mysql_real_escape_string(), bir MySQL veritabanı koymak için gereken her şeyi kaçar. Onlar temiz olduğunu ve herhangi bir otomatik kaçan yok çünkü Ama, bunun yerine (mysqli'nin olarak) hazırlanmış ifadeler kullanmak gerekir.

Başka bir şey girdi ve urlencode () URL için bir format şeyler koymak için gelen HTML kaldırmak için () htmlspecialchars'dan ile yapılabilir.

Eğer karşı savunmak zorunda saldırının iki tamamen farklı tipi vardır:

  • SQL injection: senin DB işlemek çalışır girdi. mysql_real_escape_string() ve addslashes() Bu karşı savunmak içindir. Eski iyidir, ama parametreli sorgular hala iyidir
  • Cross-site scripting (XSS): sayfanızda görüntülenen zaman, (gibi kullanıcının hesap verilerini çalmak) şeyler her türlü yapmak için bir ziyaretçinin tarayıcısında JavaScript çalıştırmayı dener, girdi. htmlspecialchars() Bu karşı savunmak için kesin yoludur.

XSS saldırıları kaçınarak "bazı HTML" sağlayan çok, çok zordur. HTML içine JavaScript kaçakçılığı sonsuz olasılık vardır, çünkü bu. Bunu yapmaya karar verdiyseniz, güvenli bir şekilde htmlspecialchars() ile tüm gerçek HTML çıkarırken, daha sonra HTML dönüştürmek olmayan HTML işaretleme sınırlı sayıda yani BBCode veya Markdown kullanmaktır. Hatta o zaman bağlantılarda javascript: URL'ler izin vermemek için dikkatli olmak zorunda. Aslında giriş HTML kullanıcıların sağlayan bu absolutely crucial for your site ise tek yapmanız gereken bir şeydir. Ve o zaman emin tamamen HTML ve JavaScript ve CSS anlamak yapma lot zaman harcamak gerekir.

Cevabı this post iyi bir cevap

Temelde, sorguları parametreleyebilir pdo arayüzünü kullanarak elle girdileri kaçan daha eğilimli çok daha güvenli ve daha az hata.

I have a tendency to escape all characters that would be problematic in page display, Javascript and SQL all at the same time. It leaves it readable on the web and in HTML eMail and at the same time removes any problems with the code. A vb.NET Line Of Code Would Be:

SafeComment = Replace( _
              Replace(Replace(Replace( _
              Replace(Replace(Replace( _
              Replace(Replace(Replace( _
              Replace(Replace(Replace( _
                HttpUtility.HtmlEncode(Trim(strInput)), _
                  ":", "&#x3A;"), "-", "&#x2D;"), "|", "&#x7C;"), _
                  "`", "&#x60;"), "(", "&#x28;"), ")", "&#x29;"), _
                  "%", "&#x25;"), "^", "&#x5E;"), """", "&#x22;"), _
                  "/", "&#x2F;"), "*", "&#x2A;"), "\", "&#x5C;"), _
                  "'", "&#x27;")

Öncelikle, genel tavsiye: veritabanında takarken anlamıyla değişkenleri kaçış yok. Değişken bağlama ile hazırlanmış deyimleri kullanmanıza izin çözümleri bol vardır. Eğer sadece bir kez unutmadan o zaman sadece bir zaman meselesi olduğu için bunu açıkça yapmak değil nedenidir.

Eğer veritabanında düz metin ekleme ediyorsanız, insert üzerinde temizlemek için deneyin, ancak bunun yerine ekranda temiz değil. Yani, demek kullanın htmlentities HTML olarak kodlamak (ve doğru charset argüman iletilmesi) getirmektir. Daha sonra veritabanı içerikleri mutlaka belirli bir olmadığı, doğru olduğuna güveniyorum artık çünkü ekranda kodlamak istiyorum.

Eğer zengin metin (html) ile ilgili iseniz, işler daha karışıktır. Mesajı bozmadan HTML "kötü" bit çıkarılması zor bir sorundur. Gerçekçi konuşmak gerekirse, sen HTMLPurifier gibi, standart bir çözüme başvurmak zorunda olacak. Ancak, bu genellikle her sayfa görünümünde çalıştırmak için çok yavaş, yani veritabanına yazarken bunu yapmak zorunda olacak. Ayrıca kullanıcı "temizlenmiş" html görmek ve temizlenmiş sürümünü doğru emin olmak gerekir.

Kesinlikle herhangi bir aşamada filtre veya kodlama çözümü "kendi haddeleme" kaçın. Bu sorunlar herkesin bildiği zor olan, ve büyük güvenlik etkileri vardır bazı küçük ayrıntı bakan büyük bir risk.

Ben ikinci Joeri, birçok olası XSS ​​saldırıların bazılarını görmek için buraya gidin, kendi uzamıyorsun

http://ha.ckers.org/xss.html

htmlentities () -> kuruluşlara karakterler dönüştürmek, html içine metin döner. UTF-8 kodlaması kullanılarak sonra diğer varlıklar olarak yerine htmlspecialchars () kullanırsanız gerekli değildir. Bu XSS karşı en iyi savunmadır. Ben html olmak niyetinde sürece hangi türde olursa olsun veya menşe her değişken Ben çıkışında kullanabilirsiniz. Orada sadece küçük bir performans maliyet ve kaçan ihtiyacı ne işe çalışırken daha kolay ve ne değildir.

strip_tags () - tüm html etiketleri kaldırarak metnin içine html dönüşür. Çıkışınızı kaçan bir yardımcı madde olarak girdi kötü bir şey olduğundan emin olmak için bunu kullanın.

mysql_real_escape_string () - mysql için bir dize kaçar ve küçük Bobby tablolar SQL enjeksiyonu karşı savunma (mysqli kullanmak ve / bağlama hazırlamak daha sonra sizin için yapılır kaçan gibi ve dağınık dize bitiştirmelerini çok önleyebilirsiniz için daha iyi)

(Ihtiyaç olması halinde yukarı kendi yapmak) esastır olmadıkça HTML girdi kaçınarak ve BBCode veya benzer yürüttüğünü yeniden obve verilen tavsiyem gerçekten çok ses.