Bu iki işlev sıhhileştirilmesinde overkill vardır?

7 Cevap php
function sanitizeString($var)
{
    $var = stripslashes($var);
    $var = htmlentities($var);
    $var = strip_tags($var);
    return $var;
}

function sanitizeMySQL($var)
{
    $var = mysql_real_escape_string($var);
    $var = sanitizeString($var);
    return $var;
}

I got these two functions from a book and the author says that by using these two, I can be extra safe against XSS(the first function) and sql injections(2nd func). Are all those necessary?

Ayrıca hijyen için, ben sql enjeksiyonları önlemek için hazırlanmış deyimleri kullanın.

Ben bu gibi kullanabilirsiniz:

$variable = sanitizeString($_POST['user_input']);
$variable = sanitizeMySQL($_POST['user_input']);

EDIT: Get rid of strip_tags for the 1st function because it doesn't do anything. Would using these two functions be enough to prevent the majority of attacks and be okay for a public site?

7 Cevap

Bu doğru, ama kaçan bu düzeyde her durumda uygun olmayabilir. Ne bir veritabanında HTML saklamak istiyorsanız?

En iyi uygulama bunları görüntülemek oldukça zaman değerlerini alan üzerine kaçan yerine, onları kaçmak gerektiğini belirler. Bu veritabanından veritabanı ve non-HTML hem HTML görüntülemek için hesap verir, ve kod bu tür mantıklı zaten, nereye ait bu gerçekten.

Giden HTML koruması diğer avantajı giden sanitization özel bir şey yapmanıza gerek kalmadan geriye dönük uygulanacaktır sırasında gelen HTML koruması, veritabanında zaten değerler için bir şey yapmayacağım bu durumda yeni bir saldırı vektörü, keşfedilen olabilir ki

Ayrıca, dikkat strip_tags, ilk fonksiyon muhtemelen halinde < tüm ve > hale gelmiştir &lt;, herhangi bir etkiye sahip olacaktır &gt;.

Dürüst olmak gerekirse, ben bu fonksiyonun yazarı hiçbir enjeksiyonları ne XSS ve SQL fikir ya da tam olarak ne kullanılan fonksiyon ya yok olduğunu düşünüyorum.

Sadece iki tuhaflıklar isim:

Ayrıca: Genel olarak, XSS agains korumak fonksiyonları tersi agains SQL enjeksiyonları korumak ve uygun değildir. Çünkü dikkat edilmesi gereken kendi özel karakterler hast her dil ve bağlam.

Benim tavsiyem neden ve nasıl kod enjeksiyon mümkündür ve nasıl karşı korumak için öğrenmektir. Çalıştığınız dilleri, özellikle özel karakterleri ve bunların nasıl kaçmak için öğrenin.


Edit İşte bazı (belki garip) bir örnek: Eğer giriş için kullanıcıların bir {bazı JavaScript kodu kullanmak bir URI bir yol segmenti olarak kullanılması gereken bazı değer izin düşünün [(1)] } değerini bağlıyor. Yani dil bağlamı, bu gibi görünüyor:

  • HTML attribute value
    • JavaScript string
      • URL yolu segmenti

Ve daha eğlenceli hale getirmek için: Bir veritabanında bu giriş değerini depolamak.

Şimdi veritabanına doğru bu giriş değerini saklamak için, sadece sizin veritabanı dili (yani SQL) içine değeri eklemek üzeresiniz bağlam için uygun bir kodlama kullanmanız gerekir; kalan (henüz) fark etmez. Bir SQL dizesi beyanı içine eklemek istediğiniz beri, içeriksel özel karakterler bu içeriği değiştirmek için izin karakterlerdir. Dize gelince bu karakterler (özellikle) ", ' vardır Beyannameleri ve kaçtı gereken \ karakter. Ama önceden hazırlanmış ifadeler sizin için tüm bu çalışmaları yapmak, bu yüzden onları kullanmak belirtti.

Şimdi veritabanında bir değere sahip olduğunu, biz doğru çıktı onları istiyoruz. Burada dış bağlamına en içteki devam etmek ve her bağlamda uygun kodlama uygulanır:

Birlikte Şimdi her şey:

'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'

$row['user-input'] Şimdi eğer "bar/baz" çıktı:

… onclick="window.open(&quot;http://example.com/&quot;%22bar%2Fbaz%22&quot;&quot;)" …

Ancak bu bağlamlarda bütün bu işlevini kullanarak hiçbir overkill. Bağlamlarda benzer özel karakterleri sahip olsa da, farklı kaçış dizilerini var çünkü. URI sözde yüzde kodlama vardır, JavaScript \" gibi kaçış dizileri vardır ve HTML &quot; gibi karakter referansları vardır. Ve sadece tek bu fonksiyonların kullanarak değil bağlamı kırmak için sağlayacaktır.

Sen, daha bir şey başarmak olmaz bu noktada strip_tags, hangi çağrı sonra (&gt; içine tüm > döndüğü) htmlentities yapıyorsun ve Orada beri are no etiketleri.

Eğer hazır deyimleri ve SQL tutucuları kullanarak ve never SQL dizeleri doğrudan kullanıcı girişi interpolating ediyorsanız, tamamen SQL sanitization atlayabilirsiniz.

Eğer tutucuları kullandığınızda, SQL deyiminin yapısı (SELECT foo, bar, baz FROM my_table WHERE id = ?) (sonunda) yer tutuculara bağlı veri değerleri ayrı veritabanı motoruna gönderilir. Bu veritabanı motoru büyük böcek engelleme, absolutely no way SQL talimatlar olarak yanlış olması veri değerleri için var, bu yüzden bu depolama için veri cendereye gerektirmeden SQL Injection saldırılarına karşı tam koruma sağlar, anlamına gelir .

No, this isn't overkill this is a vulnerability.

SQL Injection tamamen savunmasız Bu kodu. Bir mysql_real_escape_string yapıyoruz () ve daha sonra) (a stripslashes yapıyoruz. Yani ") ((mysql_real_escape_string sonra \" olmak) ve ardından stripslashes sonra geri " giderdim. Yalnız () mysql_real_escape_string sql enjeksiyonu durdurmak için en iyisidir. PDO ve ADODB gibi parametreli sorgu kütüphaneleri kullanır ve parametreli sorgular tamamen SQL enjeksiyonu durdurmak için bunu yapmak çok kolay.

Kodu test Durma:

$variable = sanitizeString($_POST['user_input']);
$variable = sanitizeMySQL($_POST['user_input']);
mysql_query("select * from mysql.user where Host='".$variable."'");

Ne olur:

$_POST['user_input'] = 1' or 1=1 /*

Yamalı:

mysql_query("select * from mysql.user where Host='".mysql_real_escape_string($variable)."'");

Bu kod aynı zamanda some types XSS açıktır:

$variable = sanitizeString($_POST['user_input']);
$variable = sanitizeMySQL($_POST['user_input']);
print("<body background='http://localhost/image.php?".$variable."' >");

Ne olur:

$_POST['user_input']="' onload=alert(/xss/)";

yamalı:

$variable=htmlspecialchars($variable,ENT_QUOTES);
print("<body background='http://localhost/image.php?".$variable."' >");

htmlspeicalchars yazdırdığınız değişken de tırnak kaplı olduğundan emin olun, tek ve çift tırnak kodlar, bu "patlak" ve kod çalıştırmak için imkansız hale getirir.

Eğer tekerleği yeniden icat etmek istemiyorsanız Peki, siz kullanabilirsiniz HTMLPurifier. Bu size ne istediğinizi tam olarak karar verir ve ne istemiyorum ve XSS saldırıları ve bu tür engeller

Ben sanitizasyona kavramı hakkında merak ediyorum. Eğer bunu yapmak istediğinizi tam olarak ne yapmak Mysql söylüyorsun: web sitesi kullanıcı tarafından kısmen yazmış bir sorgu deyimi çalıştırın. Zaten kullanıcı girişi kullanarak dinamik cümle inşa ediyoruz - kullanıcı tarafından sağlanan verileri ile dizeleri bitiştirmek. Sizin için ne sormak olsun.

Her neyse, burada biraz daha sanitization yöntemler bulunuyor ...

. Eğer sorgu dizesi inşa ederken 1) sayısal değerler için, her zaman elle önce en azından bir yere dökülmüş ya da: "(. (Int $ val") "TblTest id =) DAN alan1" SELECT;

2) tarihleri ​​için, ilk unix zaman damgası değişkeni dönüştürmek. Sonra, bir tarihe dönüştürmek için Mysql FROM_UNIXTIME () işlevini kullanın. "TblTest DAN field1 WHERE (date_field> = FROM_UNIXTIME (" strtotime ($ val) ")";... Bu aslında Mysql yorumlar ve depolar komut dosyası veya OS katmanları farklı Tarihleri ​​nasıl başa bazen yine de gereklidir.

3) belirli bir standart (adınızı, e-posta, telefon numarası, vb) takip etmelidir kısa ve öngörülebilir dizeleri, bir) hazırlanmış deyimleri yapabilirsiniz; veya b) ifadenin veya diğer veri doğrulama.

4) veya metin, notlar, wiki biçimlendirme, bağlantılar, vb), bir) yapabilirsiniz (her yerde ön-veya çift-kaçtı ve çalıştırılabilir kod yok olabilir gerçek bir standart takip etmem ve dizeleri için Hazırlanan tablolar; veya b) mağaza ve ikili / blob şeklinde dönüştürmek - hatta sorgu dizesi değeri geçen çıkartırken geri dönüştürmeden önce ikili, hex veya ondalık gösterimi her karakteri dönüştürme. Geri dışarı saklanan değeri tükürmek Bu şekilde sadece html doğrulama daha fazla odaklanabilirsiniz.