Bir SQL deyimi tehlikeli olduğunu İşaretler

5 Cevap php

Ben bir SQL deyimi ne kadar tehlikeli olduğunu denetler PHP bir işlevi geliştirmek istiyorum. I tehlikeli derken ben, bazı semboller, karakterler veya kullanıcı görmek gerektiğini, bir veritabanından veri almak için kullanılan dizeleri demek.

Örneğin:

SELECT * FROM uyeler WHERE userId = '1 '

çeşitli yollarla enjekte edilebilir. I params temiz olmasına rağmen, ben de sorgu çalıştırmak için ne kadar güvenli izlemek istiyorum.

Şimdiden teşekkürler

5 Cevap

Sen var olmamalı soruna yönelik bir düzeltme bulmaya çalışıyoruz. Daha sonra hiç bir SQL enjeksiyon hakkında endişelenmenize gerek yoktur ve sorgu kendisi gibi kaçan sabit ve yalnızca argümanlar değişken olduğunu, hazırlanan (önceden derlenmiş) sorguları kullanmanız gerekir.

PHP bunları kullanarak bir örnek için buraya bakınız: http://mattbango.com/notebook/web-development/prepared-statements-in-php-and-mysqli/

Diğer bir avantajı, sunucu sorgunun her zaman ayrıştırmak zorunda değildir gibi, en azından MySQL için, çok hızlı olmasıdır.

Bu article, bazı SQL enjeksiyon önlemek iyi örnekler, ve sql enjeksiyon sorunları iyi açıklaması var.

Sen params "temizlemek" değil. Bu veri kıracak. Neden "O'Reilly" denilen birisi veritabanına kendi ismini girmek için izin gerekmez mi?

Değişmez bir SQL dizesi içine herhangi bir dize koymak, onu kaçmak gerekir, ya da, SQL enjeksiyon hakkında endişelenmenize gerek yok bu yüzden daha iyi kullanan cümlelerin parameterised. Giriş tarafında "Dezenfeksiyon" yanlış bir yaklaşımdır: bu gereksiz sınırlamalar ekler ve bütün sorunu çözmüyor.

Eğer kaçmış değil bunun içinde any değişken dize sahip bir SQL deyimi oluştururken varsa, bu dönem güvensiz. Bu basit SELECT *, ya da katılır ve sorgular bir kitlesel karmaşık bir yük olsun, o sadece savunmasız yapmak için bir enjeksiyon alır.

Ben parametrized sorguları gitmek için en iyi yol olduğunu kabul. Ancak çoğu php / mysql uygulamaları SQL enjeksiyon çeşit çoğu web uygulamaları da savunmasız mysql_query () kullanın ve.

Suhosin Hardened PHP, birçok LAMBA sistemlerinde varsayılan olarak yüklenir ve "experimental SQL injection heuristics" adında bir özelliği var, ama ben biliyorum herhangi patlatır sonu yok. Daha iyi bir çözüm işlenmemiş HTTP sorguda sql enjeksiyon gibi saldırılar için arayan bir Web Application Firewalls (WAF) 'dir. Wafs olan PCI-DSS tarafından gerekli işe çünkü yaygın bugün internet üzerinde kullanılan bir.

Sorgular look different enjekte gerçeği bahis GreenSQL denilen bir uygulama var. Çoğunlukla bu güvenli bir bahis olduğunu, ancak SQL ücretsiz oluşmuş Bildirime dilidir ve bir saldırganın aynı saldırıyı gerçekleştirmek için bir sorgu yazabilirsiniz birçok yolu vardır. Kısacası secuirty bu tip bazı saldırıları durdurmak, ancak parametrized sorguları karşılaştırıldığında zaman kusurludur. WAF en GreenSQL, bu saldırıları tespit etmek için kullanılan normal ifadeler büyük kütüphanesinde geçmiş kayıyor şekilde bir saldırıyı kodlamak veya karartmak için onun mümkün olduğunca aynı sorunu muzdarip. Bobince's answer to this question beni çatlaklar, onun nokta sömürü süreci için de geçerlidir.

Eğer odaklanmak istiyorum üç alan vardır:

  1. Sanitise your input. This doesn’t mean stripping out characters, it means defining an acceptable. whitelist and rejecting exceptions
  2. User parameterised SQL statements rather than building up a concatenated string of syntax and values.
  3. Secure the data layer as far as you can by applying the principle of least privilege and restricting public user access to only the absolutely essential functions i.e. not allowing write access to many of the tables.

OWASP Top 10 for .NET developers part 1: Injection: Bu yararlı olabilir

Bu. NET Devs için yazılmış ama ilkeler PHP eşit aktarmak oluyor.