Iyi nedir, depolamak sonra Escape Veya çıkışını kaçış sonra depolamak?

4 Cevap php

I büyük bir seçim olsa bile herhangi biri bu konuştuk bulamadık stackoverflow üzerinde uzun bir arama yaptıktan sonra, Soru sonra DB saklayın verileri kaçan, XSS ve SQL enjeksiyon hem de önlemek için en iyisi budur ya onu olduğu gibi saklayın ve ne zaman çıktı bu kaçış?

Not: Eğer UYGULAMALARI mümkünse bazı örnekler vermek eğer daha iyidir.

Teşekkürler

4 Cevap

(Diğerlerinin önerdiği gibi, veya SQL ayrı gönderilen) veri depolama için, and gösterimi için HTML-kaçtı düzgün SQL-öncelenmesi gerekir.

Için, aşağıdakileri yapmanız gerekir -

  1. Senin beklentilerini karşılayan görmek için giriş doğrulamak. Eğer değilse, giriş reddetmek ve durdurmak. O karşılar, bir sonraki adıma without altering giriş devam ediyor.

  2. Bir parametreli sorgu için girdi bağlamak, ya da sorguyu oluşturan olarak girdi kaçış. Girişini kaçan does not girişini değiştirmek unutmayın. Veritabanı her zaman kullanıcının girdiği dizeyi içerir.

  3. Kullanıcıya görüntüleyerek zaman, bağlama göre onu kaçmak zorunda. Aynı dize kaçan edilebildiği yaklaşık 5 farklı yolu vardır - HTML öğesi görüntülemeden olup olmadığına bağlı olarak, HTML niteliği, Javascript, CSS, ya da bir URL olarak. Bkz http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet. Yine, bu kaçışa dize değiştirmez hatırlıyorum. Kullanıcı must hep girmişti dizeyi bakın.

Siz veritabanında değiştirilmiş bir dize saklamak için cazip olabilir - ama bunu yapmayın lütfen. HTML için kaçış, javascript dize kullanmak asla. Eğer arka uç işlem yapmak varsa, dize de-kaçmak olurdu. Yakında artık doğru olanı yapmak bir aşamaya ulaşacak.

Kaçan başka bir katmandan diğerine veri taşımak için sadece bir yolu olduğunu unutmayın. Dinlenme (veritabanı veya ekran) de, veri tam kullanıcı olarak girdiğiniz şekilde bakmak gerekir.

Çok hareket trying, bir SQL enjeksiyon veri içeren ne causes SQL enjeksiyon saklamak için çünkü soru çok mantıklı değil.

Her iki durumda da, Parameterized queries SQL enjeksiyonu önlemek için kullanıyor olmalıdır.

O zaman sadece bunun yerine görüntülenen her zaman, bir kez bu işlem yapmak zorunda, çünkü XSS / HTML kaçmak için, ben şahsen çok, ekleme-zaman yapardım. Küçük bir optimizasyon, ama kolay bir.

Giriş, mağaza Escape, sonra çıkış kaçış.


Eğer kaçış olmadan depolamak, SQL enjeksiyon savunmasız.

Örnek: Sen bir sorgu var:

mysql_query("SELECT * FROM `table` WHERE `abc`= '{$_POST['def']}';

En $ _POST ['def'] eşit olduğunu varsayalım

blah'; DROP TABLE `table`; SELECT * FROM `table` WHERE 'abc' = '123

Yani kaçmış değil eğer tablo kesilmesine neden olur.


Kaçmadan size çıkış varsa, XSS savunmasız demektir.

Aksi takdirde, kullanıcılar diğer kullanıcıların görebilirsiniz sayfalarına zararlı Javascript enjekte edebilir.