Htmlentities mysqli_real_escape_string vs vs addslashes

7 Cevap php

PHP uygulamaları güvence bazı okuma yapıyorum, ve mysqli_real_escape_string MySQL tablolarına veri eklerken addslashes Bazı garip şeyler neden olabilir çünkü kullanmak doğru işlevi gibi geliyor bana Bir akıllı saldırgan gerçekleşmesi için. Değil mi?

Ancak, bana kafa karıştırıcı bir şey var. Ben onların verileri korumak için geri kullanıcılara kullanıcı tarafından girilen verileri yankılanan, ama o gibi görünüyor zaman htmlentities addslashes olan addslashes daha iyidir tavsiye ediliyor hatırlıyorum görünüyor güvenlik açığı ile. Bu doğru mu, yoksa yanlış hatırlayarak?

7 Cevap

Veri için farklı bağlamları vardır. Veritabanına veri ekleme bağlamı farklı html / xml veya hatta bir e-posta mesajı oluşturma bağlamında daha kaçtı gerekmektedir.

Bir db girmeden kaçan veri hazırlanan tabloların lehine tüm yeni kodu önerilmemektedir edilmelidir. Aksi takdirde söyler herkes size büyük bir kötülük yapıyor.

Tarayıcıya dönük verileri kaçan hedefe bağlı olarak farklı şekillerde bir dizi kaçan edilmesi gerekmektedir. Bazen htmlspecialchars'ın bazen htmlentitiesi kullanmanız gerekir, yeterli. Bazen sayısal varlıkları gerekir. Bu nüansları tüm bilmek için biraz araştırma yapmanız gereken bir konudur.

Doğrulamak benim yaşamak genel kural (reddetmek, filtre değilse yanlış) giriş & (bağlamına dayalı) çıktı kaçış.

Farklı amaçlar için farklı araçlar vardır.

mysqli_real_escape_string MySQL içine sokmak için veri güvenli yapar (ama parametrized sorguları daha iyi).

Htmlentities bir HTML belgeye çıkış için güvenli veri yapar

addslashes birkaç diğer durumlar için veri güvenli hale getirir, ancak MySQL için yetersiz

Ayrıca PDO libs, hangi yapar kullanabilirsiniz durumda sunucularında PHP5 kullanabilir, sizin için kaçan çoğu.

Geri yankılanan ben şahsen htmlspecialchars tercih ediyorum, ama kimse beni düzeltebilir

evet, tüm kullanıcı girişi mysqli_real_escape_string veya PDO gibi bir kitaplığı kullanın. Geri yankılanan zaman tırnak da dahil olmak üzere html kuruluşlar, tüm karakterleri kaçar gibi, ben, ikinci parametre olarak ENT_QUOTES ile htmlentitiesi kullanın.

Not: UTF-8 kodlu belgede htmlentitiesi () kullanarak kaçınılmalıdır. Bkz:

(phpwact.org alıntı) dikkat:

With modern web browsers and widespead support for UTF-8, you don’t need htmlentities because all of these characters can be represented directly in UTF-8. More importantly, in general, only browsers support HTML‘s special characters - a normal text editor, for example, is unaware of HTML entities. Depending on what you’re doing, using htmlentities may reduce the ability of other systems to “consume” your content.

Also (not confirmed but sounds reasonable - from anon comment here), character entities (stuff like » or —) do not work when a document is served as application/xml+xhtml (unless you define them). You can still get away with the numeric form though.

http://www.php.net/manual/en/book.filter.php: Yukarıdaki PHP 5.2 ve başka ilginç bir çözüm filtre uzantısını kullanmak için

It allows you to validate and sanitize user inputs. There are many built-in filters available and they can be combined with flags to tweak their behaviour. In addition hese filters can also be used to validate/sanitize ints, floats, emails, specific regular expressions.

Ben şahsen formları doğrulamak ve çıkış kullanıcı tarafından girilen verilere benim projelerde onları kullanmaya başladı, ve ben yaptım çok memnunum. Ben bir MySQL veritabanı değerleri eklediğinizde, ben güvenlik için hazırlanmış sorguları kullanmak rağmen. Bu çözümler birlikte çoğu SQL enjeksiyonu ve XSS-tip saldırıları önlemek yardımcı olabilir.

Sen bir "kaçış" fonksiyonu var ve o zaman tüm iş bekleyemezsiniz. Belirli sanitasyon rutinleri gerektiren farklı saldırılar vardır. Bu kavramı anlamak için tek yolu bazı hassas kod yazmak ve daha sonra bunu istismar etmektir. Yararlanma kodu yazma herhangi bir güvenlik sisteminin anlaşılması için hayati önem taşımaktadır.

Örneğin bu sorgu Sql enjeksiyon için açıktır:

$host=htmlspecialchars($_GET[host],ENT_QUOTES);
$name=htmlspecialchars($_GET[name],ENT_QUOTES);
mysql_query("select * from user where Host='$host' and Name='$name' ");

Exploit: http://localhost/sqli_test.php?host=\&name=%20sleep(20)--%201

Mysql için en iyi kaçış işlevi mysqli_real_escape_string edilir () ama bu başarısız olabilir:

mysql_query("select * from user where id=".mysqli_real_escape_string($_GET[id]));

exploit: http://localhost/sqli_test.php?id=1%20or%20sleep(20)

Aslında SQL enjeksiyon dikkat çekmek için en iyi yolu, bir kaçış işlevini çağırarak değil, onun sql enjeksiyon için adodb en parametrized quires kullanarak. XSS htmlspecialcahrs ($ var, ENT_QUTOES) kullanın. Web uygulama güvenliği ile yanlış gidebilir daha bir sürü daha var çünkü OWASP top 10 okuyun.