SORU
25 EYLÜL 2008, PERŞEMBE


PDO hazırlanmış deyimleri SQL enjeksiyon önlemek için yeterli mi?

Hadi bu gibi bir kod var diyelim:

$dbh = new PDO("blahblah");

$stmt = $dbh->prepare('SELECT * FROM users where username = :username');
$stmt->execute( array(':username' => $_REQUEST['username']) );

PDO belgelere diyor ki:

Hazır deyimler için parametreleri kote olması gerekmez; şoförü sizi yönetir.

Gerçekten tek yapmam gereken SQL enjeksiyonları önlemek için mi? Gerçekten bu kadar kolay mı?

Eğer bir önemi varsa MySQL kabul edilebilir. Ayrıca, gerçekten sadece SQL enjeksiyon karşı hazırlanan tabloların kullanımı hakkında merak ediyorum. Bu bağlamda, XSS ya da diğer olası güvenlik açıkları umurumda değil.

CEVAP
25 EYLÜL 2008, PERŞEMBE


Parametre tabanlı sorgular / hazırlanmış deyimleri genellikle önlemek için yeterlidir1 siparişbu ifadeyi enjeksiyon*. Eğer un-kontrol dinamik sql uygulama başka bir yerde kullanırsanız hala açıktır2cienjeksiyon.

2ci enjeksiyon verileri bir kez bir sorgu dahil edilmeden önce veritabanı sirküle edilmiştir, ve çok daha zor koparmak demektir. AFAIK, hemen hemen hiç genellikle saldırganların sosyal mühendislik yollarına daha kolay olduğu gibi, gerçek 2ci saldırılar.

Daha sonra sorguda sabit değer olarak kullanılan bir veritabanında saklanır gibi bir değeri neden varken 2ci enjeksiyon bir saldırı gerçekleştirebilirsiniz. Örnek olarak, diyelim ki bir web sitesi (bu soru için MySQL DB varsayarak) bir hesap oluştururken yeni kullanıcı adınız olarak aşağıdaki bilgileri girin ki:

'   (SELECT UserName   '_'   Password FROM Users LIMIT 1)   '

Eğer kullanıcı adı üzerinde diğer kısıtlamalar ise yok, hazırlanmış deyimi hala yukarıda gömülü sorgu ekleme anında idam değil emin olun, ve değeri doğru veritabanında saklamak. Ancak, daha sonra uygulama veritabanından kullanıcı adınızı alır ve dize birleştirme bu değer, yeni bir sorgu eklemek için kullandığını hayal edin. Başka birinin şifresini görebilirsin. Kullanıcılar ilk birkaç isim tablosu yöneticileri olma eğilimindedir beri, bir de çiftlik hediye olabilir. (Not: Bu düz metin olarak şifreleri saklamak için bir neden daha!)

Hazırlanan ifadeleri yeterli tek bir sorgu için, o zaman görürüz, ama kendileri tarafındandeğiluygulama içinde bir veritabanına tüm erişim güvenli kod kullanan uygulamak için bir mekanizma eksikliği nedeniyle bütün bir uygulama boyunca sql enjeksiyon saldırılarına karşı korumak için yeterli. Ancak, kullanılan bir parçası olarak iyi uygulama tasarımı-içerebilir uygulamaları gibi bir kod Gözden Geçirme veya statik analiz veya bir ORM, veri katmanı, katman veya hizmet sınırları dinamik sql -hazırlanan tablolarSql Enjeksiyon sorunu çözmek için birincil araçtır.Eğer iyi uygulama tasarım ilkeleri, veri erişim programınızın diğerlerinden ayrılmış gibi izlerseniz, kolay uygulamak veya her sorgu doğru parametreleri kullanan bir denetim olur. Bu durumda, sql enjeksiyonu (ilk iki sıra) tamamen engellenmiş olur.


*MySql (tamam, oldu) sadece geniş karakterler söz konusu olduğunda parametreleri kullanma hakkında aptal ortaya çıktı ve hala varnadirdava enjeksiyon parametrik sorgu arasından kayıp gitmesine izin veren diğer yüksek oy cevap burada özetlenen.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 30GB

    30GB

    14 AĞUSTOS 2006
  • BurnedInDotCom

    BurnedInDotC

    3 NİSAN 2010
  • wwjoshdo

    wwjoshdo

    25 Mayıs 2009