SORU
24 Kasım 2011, PERŞEMBE


Nasıl hazırlanmış deyimleri SQL enjeksiyon saldırılarına karşı koruyabilir mi?

Nasıl prepared statements SQL injection saldırıları önlemek?

Wikipedia diyor ki:

Hazırlanmış deyimleri SQL enjeksiyon, çünkü karşı dirençlidir daha sonra iletilen kullanan parametre değerleri, farklı bir protokol, doğru kaçtı. Özgün bir ifade şablon harici giriş türetilen, enjeksiyon SQL değil oluşur.

Edemem çok iyi bir neden görmüyorum. Herkes nazik basit bir açıklama (İngilizce benim ana dilidir kadar kolay İngilizce ile) ve bazı örnekler verebilir misin?

CEVAP
25 Kasım 2011, Cuma


Fikir çok basit - sorgu ve verileri SQL sunucusuna gönderilirayrı ayrı.
Hepsi bu.

SQL enjeksiyon sorunun köküdürkod ve veri karıştırma.

Aslında, SQL sorgutam yasal bir program. Ve bu program dinamik olarak anında bazı veriler ekleyerek yaratıyoruz. Böylece, bu veriler program engel olabilirkodve hatta bunu değiştir, her enjeksiyon örnek olarak gösterir:

$expected_data = 1;
$query         = "SELECT * FROM users where id=$expected_data";

düzenli bir sorgu oluşturur

SELECT * FROM users where id=1

bu kod ise

$spoiled_data = "1; DROP TABLE users;"
$query        = "SELECT * FROM users where id=$spoiled_data";

kötü niyetli bir dizi üretecek

SELECT * FROM users where id=1; DROP TABLE users;

Doğrudan program vücut için veri ekliyoruz çünkü çalışır ve programın bir parçası haline gelir.

Bu yüzden, veri programını değiştirebilir ve iletilen verileri bağlı ya da normal çıkış veya masa users silinmiş olacak.

Süreprogramımızı değiştirmek istemiyoruz hazırlanan tabloların durumda, değişmeden kalır
Konu bu.

Gönderiyoruzprogramsunucuya ilk

$db->prepare("SELECT * FROM users where id=?");

veri ile ikame edilirdeğişken"". yer tutucu olarak adlandırılan

Aynı sorgu sunucusu, herhangi bir veri olmadan gönderilen not! Ve sonra ikinci isteği, sorgu kendisinden tamamen ayrı ile veri gönderiyoruz:

$db->execute($data);

yani, programımızı değiştirmek ve herhangi bir zararı olmaz.
Oldukça basit değil mi?

Ancak, belirtmek için değerher zaman değiltutucu kullanıyorsanızhazırlanan bir ifadesi olarak işlenir.

Hazırlanmış deyimi sadece alt sırada yer tutucudur gelecekteki işleme için bir değişken ile gerçek veri değiştirme için genel bir fikir.

Bazen biz aslında veri ile birlikte sorgu oluşturmak için çok fazlaeğer veri her bit düzgün Türüne göre biçimlendirilmiş eğer yanlış bir şey oldu olabilir.

Yani, varsayılan PDO ile örneğinHazır İfadeler kullanmayınama oldukça normal bir sorgu oluştur. Ama düzgün biçimlendirilmiş veri ile her yer tutucu yerine çünkü, kötü bir şey olabilirdi.

Ama söylemek istediğin PDO düz yol, gerçek hazırlanmış ifadeler kullanmak için, bu ayarı ayarlamak için:

$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

Lütfen şunu unutmayınbiçimlendirme kaçan ile karıştırılmamalıdır. Biçimlendirme aptal kaçan daha çok eylemleri içerir. Yani, en azından her farklı sorgu kısmı için her biçimlendirme kuralı tanıyana kadar el evde kaçan çalışmayın.

Ekleyeceğim tek şey, her zaman her el atlanmış:

Hazırlanmış deyimleri sadece koruyabilirsinizveriamaprogram kendini savunamaz.
Yani, bir kez ekleyin, bir dinamik söylemek zorundayıztanımlayıcı- alan adı, örneğin, ifadeleri bize yardım edemez hazırladı. Kendimi tekrarlamak istemiyorum bu yüzden explained the matter recently yaptım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • Joanna Okrajni

    Joanna Okraj

    4 EYLÜL 2010
  • kylelandry

    kylelandry

    9 AĞUSTOS 2007