Soru HazırlananStatement SQL enjeksiyonundan kaçınıyor mu? [çift]


Bu sorunun zaten bir cevabı var:

Uygulamam için savunmasız sql sorgularını okudum ve denedim. Bu yeterince güvenli değil. Veritabanı doğrulamaları ve diğer ekleme işlemleri için yalnızca Deyim Bağlantısını kullanıyorum.

HazırlananStatements güvenli midir? ve ayrıca bu ifadeyle ilgili herhangi bir sorun olacak mı?


32
2017-12-02 08:21


Menşei


Hazırlanan ifadeler yoldur. AFAIK'in hazırladığı bir ifade sadece bir kez ayrıştırılacak, böylece daha sonraki bir tarihte SQL enjeksiyon şansı kalmayacaktır. Tabii ki, hala XSS saldırılarına karşı koruma sağlamak için girişi dezenfekte etmeniz gerekiyor. - CurtainDog


Cevaplar:


Sorgunuzu rasgele girdiden oluşturmak için dize birleştirme kullanılmaz. PreparedStatement kasa. Bu örneğe bir göz atın:

preparedStatement = "SELECT * FROM users WHERE name = '" + userName + "';";

Birisi koyarsa

' or '1'='1

gibi userName, sizin PreparedStatement SQL sorgulamaya karşı savunmasız olacaktır, çünkü bu sorgu veritabanı olarak çalıştırılacaktır.

SELECT * FROM users WHERE name = '' OR '1'='1';

Eğer kullanırsanız

preparedStatement = "SELECT * FROM users WHERE name = ?";
preparedStatement.setString(1, userName);

Güvende olacaksın.

Bu kodun bir kısmı Bu Wikipedia makalesi.


50
2017-12-02 08:43



SetString herhangi bir fark yaratıyor mu? aslında ne yapıyor? Hatta bu dizenin yerini alacak. Ne farklı yapar? - Mohamed Saligh
@Mohamed: Bir fark yaratıyor. Sorgu "SELECT * FROM users WHERE name = ?" derlendikten sonra veritabanına gönderilecek ve ardından userName itibaren setString ikame edilecek. Veritabanı yasadışı bir değer görürse, bir hata verir. Yani, ' or '1'='1 işleç içeren bir ifade olarak değil, bütün bir dize olarak ele alınacaktır. or ve =. Veritabanı, değeri bir dize olarak görecek "' or '1'='1". - darioo


Hazırlanan deyim, doğru kullanıldığında, SQL enjeksiyonuna karşı koruma sağlar. Ancak lütfen sorunuza bir kod örneği gönderin, bu yüzden doğru şekilde kullanıp kullanmadığınızı görebiliriz.


2
2017-12-02 08:25





İyi kullanarak sadece PreparedStatement seni güvende yapmaz. Parametrelerinizi SQL ile mümkün olan sorgu PreparedStatement. Bak İşte daha fazla bilgi için.


1
2017-12-02 08:25





Açıklandığı gibi Bu makale, PreparedStatement Dizeleri hala birleştiriyorsanız tek başına size yardımcı olmaz.

Örneğin, bir haydut saldırgan hala aşağıdakileri yapabilir:

  • Tüm veritabanı bağlantılarınızın meşgul olması için bir uyku fonksiyonu çağırın, bu nedenle uygulamanızı kullanılamaz hale getirin
  • DB'den hassas verileri ayıklamak
  • kullanıcı kimlik doğrulamasını atlamak

Ve sadece etkilenebilecek SQL değil. Bağlama parametrelerini kullanmıyorsanız JPQL bile tehlikeye girebilir.

Alt satırda, SQL ifadeleri oluştururken asla dize birleştirme kullanmamalısınız. Bu amaçla özel bir API kullanın:


1
2017-11-08 15:01