Güvenli kullanıcı girişi

Kaçan karakterlerle ilgili pek çok forum (ve yığın taşma) yazıları okudum ve kullanıcı girişlerini dezenfekte ettim, ama hepsini bir araya getirip Android platformuna biraz daha özel hale getirmek istiyorum. İşte durumum:

SOAP xml iletileri ile bir web servisiyle iletişim kuran bir Android uygulamasına sahibim. İşte gönderilebilecek bir örnek xml mesajı (etrafında SOAP zarfı bırakıyorum):


    user entered text
    
user entered text

Gördüğünüz gibi, bir kullanıcının bir metni metin biçiminde girebildiği, sonra da bu mesaja eklendiği ve web servisine gönderilecek 2 yer vardır. Yapmam gerekenler:
A) geçerli xml ve
olduğundan emin olun B) zararlı bir SQL içeriği içermediğinden emin olun.

Are there any pre-included utilities in the Android API to escape invalid xml chars (such as &) that the user may have entered? (So that I can simply say "escapeXML(xmlstring);" or something like that)

Kötü amaçlı SQL (veya başka bir kod enjeksiyonu) olup olmadığını kontrol etmek için herhangi bir yolu var mı yoksa sunucu tarafında ele alınmalıdır?

Yan not olarak: Kullanıcının sadece A-z, 0-9 ve temel noktalama işaretlerini (bazen bile görülemeyen veya yorumlanamayan garip unicode karakterlerden kaçınmak için) girmesini tercih ederim. Kullanıcı girdisini bir karakter alt kümesine kısıtlamanın iyi bir yolu var mı?

Bunun tek bir soruda yapıldığını biliyorum, bu yüzden sadece bir parçasını biliyorsanız, lütfen bir cevap verin ve kabul etmekten ya da kabul etmekten mutlu olacağım. Tüm yardım için şimdiden teşekkür ederiz! (StackOverflow, çok fazla forum ileti dizisini tükettiğimde geldiğim yer ve benim durumumda neyin uygun olduğu konusunda kendimi eğittim)

1
Sanırım regex ile kısıtlayabilirsin, ama yapmazdım. İlk önce, bu şekilde kısıtlamak, hiç bir şekilde enjeksiyona karşı koruma sağlamayacaktır (tek ihtiyacınız olan basit bir davranıştır). İkincisi, kullanıcılarınızdan herhangi biri yabancı bir karakter seti kullanıyorsa (hatta doğru bir şekilde yabancı kredi kelimelerini girmeye çalışıyorsa), girişleri reddedilirse biraz rahatsız olabilir. Normal olarak, biçimlendirilmiş xml - depo varlıkları (sınıf örnekleri) saklamamalısınız. Parametreli sorgular SQL enjeksiyonu ile ilgilenmelidir - burada da siteler arası komut dosyasına dikkat etmeniz gerekecek.
katma yazar Clockwork-Muse, kaynak
Müvekkilin haberini bilmeden, kesin olarak söyleyemem, ama yabancı kelimeleri daha sık kullandığından daha iyi kullanıyor olabilirsiniz (doğru bir şekilde 'yazmıyor olsanız bile). İstemciniz yalnızca ABD'de çalışıyor olsa bile (daha çok alan/lokasyona bağlı olarak). Normalde SOAP ile çalışırken, mesajı serileştiren/serileştiren bir çerçeve/kütüphane kullanıyorsunuz - kodunuz xml mesajından geldiğini bile bilmese bile (muhtemelen olmasın). Java için birkaç tane var, Android'e özgü bir sürümü bilmiyoruz.
katma yazar Clockwork-Muse, kaynak
Biliyorum ki, sadece ABD'de işe yarayan belirli bir müşteri için özel olarak yazılmış bir uygulama olduğu için yabancı sözcükler konusunu ele almayacağız. Ayrıca, metnin, sayıların ve noktalama işaretlerinin girişini kısıtlamanın SQL enjeksiyonunu engelleyeceğini düşünmüyordum, ancak metin okuyucuyu (örneğin zihin bir Kontrol karakterinin nasıl okunacağını bilmediği için) )
katma yazar D.R., kaynak

1 cevap

SQL Injection ile baş etmenin en iyi yolu parametreli sorguları kullanmaktır. Bu sunucu tarafında yapılır. Diğer her şey ikincil, gereksiz veya sorunun yüzeyini zorlukla çizer.

Bunları okumalısın:

Jeff Atwood'un blogunda, onun nerede dediğini beğendim:

Parametrelenmemiş SQL, veritabanı programlama GoTo deyimidir.

3
katma
Avid GoTo kendimden nefret ettiğim için, bunu takdir edebilirim ve sunucu tarafında neler yapabileceğimize bakabilirim (web servisleri bir IBM Maximo varlık yönetim sistemine bağlı olduğundan, sınırlı olabilir ya da zaten bizim için yapabilir).
katma yazar D.R., kaynak