SORU
7 EKİM 2008, Salı


Fıkra alternatifleri PreparedStatement?

En iyi çözümler için kullanarak bir SQL IN fıkra ile örnekleri java.sql.PreparedStatement, hangi desteklenmiyor için birden çok değer nedeniyle SQL enjeksiyon saldırı güvenlik sorunları: ? yer tutucu temsil eden tek bir değer yerine bir değerler listesi.

Aşağıdaki SQL deyimi düşünün:

SELECT my_column FROM my_table where search_column IN (?)

preparedStatement.setString( 1, "'A', 'B', 'C'" ); kullanarak aslında ilk başta ? kullanma nedenleri geçici bir çözüm de çalışmayan bir girişimdir.

Geçici çözümler vardır.

CEVAP
9 EKİM 2008, PERŞEMBE


Çeşitli seçenekler mevcuttur, ve her artılarını ve eksilerini analiz here mevcuttur.

Seçenek önerdi:

  • SELECT my_column FROM my_table WHERE search_column = ?, her değeri, ve UNİON sonuçları istemci tarafında çalıştırmak için hazırlayın. Gerektirir sadece bir ifadeni. Yavaş ve acı verici.
  • SELECT my_column FROM my_table WHERE search_column IN (?,?,?) hazırlamak ve çalıştırmak. Gerektirir boyutu---listenin başına bir hazırlanmış deyimi. Hızlı ve belirgin.
  • SELECT my_column FROM my_table WHERE search_column = ? ; SELECT my_column FROM my_table WHERE search_column = ? ; ... hazırlamak ve çalıştırmak. [Ya o noktalı yeri UNION ALL kullanın. --ed] bir hazırlanmış deyimi Gerektirir boyutu---listenin başına. Aptalca yavaş, blogger bile önerdi neden bilmiyorum WHERE search_column IN (?,?,?) daha kesinlikle daha kötü.
  • Bir saklı yordam sonuç kümesi oluşturmak için kullanın.
  • N boyutu---listesinin farklı olması gerekir; ki, 2, 10, ve 50 değerleri ile sorgular. SELECT my_column FROM my_table WHERE search_column IN (1,2,3,4,5,6,6,6,6,6) gibi 6 farklı değerler listesi için bir arama yapmak, doldurmak boyutu-10 sorgu. Herhangi bir iyi sunucu sorguyu çalıştırmadan önce dışarı yinelenen değerleri optimize eder.

Bu seçeneklerden hiçbiri süper harika ama.

Yinelenen sorular aynı derecede aklı başında alternatifleri ile bu yerlerde cevaplanmış, hala hiçbiri süper:

Eğer JDBC4 ve x = ANY(y), burada anlatıldığı gibi PreparedStatement.setArray kullanmak için destekleyen bir sunucu kullanıyorsanız, Doğru Cevap,:

setArray listeler ile iş yapmak için herhangi bir yol olacak hali yok.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matt Stokes

    Matt Stokes

    22 Ocak 2008
  • steven johns

    steven johns

    11 Mart 2011
  • xCraash

    xCraash

    6 Temmuz 2012