PHP Dosyalar SQL için ayrıştırma için en iyi yaklaşım?

6 Cevap

Benim üst düzey tez, ben otomatik olarak hazırlanmış deyimleri kullanarak SQL injection açıkları düzeltmeleri algılar ve öneririm bir program geliştirdi. PHP için özel mysqli uzantısı. SO toplum için Benim soru şudur: Ne tercih edilen yaklaşım PHP kaynak kodunda SQL tespit olurdu?

Ben SQL keywords (SELECT, INSERT, ...) containg bir enum kullanılan ve temelde herhangi bir SQL mevcut olup olmadığını belirlemek için enum yineleme, her satırı çözümlü. Ayrıca, ben çözümleyici yanlışlıkla html (örneğin <\ select>) tespit değildi emin olmak zorundaydı.

Benim için bu çözüm iyi çalıştı, ama şimdi ben şimdi ellerimi biraz daha fazla zaman ve daha zarif (ve verimli) çözümü kullanmak için kod üstlenmeden düşündüm. O benim program içeri ne yazdı olduğu gibi C# kullanarak için çözüm sınırlandırın

6 Cevap

Your solution seems fine to me. The other way would be to parse the PHP file with a Lex/Yacc parser using the grammar for PHP, there is one good C# grammar parsing tool called Coco/R http://www.ssw.uni-linz.ac.at/coco/.

Ancak ben dili ayrıştırmak yaparsanız, hiçbir ek sonuçlar için çok fazla zaman (geliştirme ve bilgi işlem) tüketen sona erecek inanıyorum.

Ben fırsatçı yaklaşımı ile sopa, ancak çeşitli PHP kodu karşı test ve olası tüm taleplerini karşılamak üzere çimdik olacaktır.

Belki BNF SQL92, diyelim ki, karşı metin satırları ayrıştırma ve fragmanları dilbilgisi maç nasıl yakından ilgili her satırı puanlama bazı milaj gidecekseniz.

Ancak bazı ağır kaldırma gibi geliyor. Sizin basit bir yaklaşım, gerçek dünya durumlarda böyle büyük bir yüzdesini zaten çekecektir.

PHP kullanarak için beni affet veya aşağı-oy zorunda yüzden C # değişkenlerin özelliklerini bilmiyorum ama zamanın% 70'i benim SQL sorgusu şöyle bir değişken gider

$sql = "SELECT * FROM table;";

Bunun ötesinde ben size zaten ne geliştirmek için yapabileceğiniz bir şey düşünmek mümkün duyuyorum.

Eğer dizesi içinde birkaç satır ve kullanımı değişkenler üzerinde oluşturulan hesap tabloları içine alıyor musunuz? (Örnek aşağıda)

$sql = "SELECT * FROM table WHERE fname = $fname OR snmae = $sname";

Ben fonksiyonu yerine SQL kendisi arıyor çağırır bakmak için iyi olacağını söyleyebilirim. Muhtemelen hazırlanmış bir sorgu olmayan bir SQL sorgusu çalışıyor neden işlev çağrıları aramak için PHP çözümleyici değiştirin.

PHP kullanarak için beni affet veya aşağı-oy zorunda yüzden C # değişkenlerin özelliklerini bilmiyorum ama zamanın% 70'i benim SQL sorgusu şöyle bir değişken gider ..

Evet, benim özgün yaklaşım sadece $ sql aramak olduğunu most insanların ne kullanın beri vars, ancak bazı geliştiriciler bazı funky değişken adlarını kullanmak çünkü birkaç PHP uygulamalar karşısında test edildikten sonra ben çabuk çözüm dışarı attı ...

Eğer dizesi içinde birkaç satır ve kullanımı değişkenler üzerinde oluşturulan hesap tabloları içine alıyor musunuz? (Örnek aşağıda)

Yep. Ben de koşullu oluşturulan tabloları işlemek için çalıştı, ama bu her zaman çok işe yaramadı. ;)

Fonksiyonları ile kullanılan tüm CRUD sql ifadeleri tespit etmek için basit bir regex (bütün php komut $ komut dosyası içeren varsayarak)

preg_match_all('/\(\s*?"(?:SELECT|INSERT|UPDATE|DELETE) .*?"\s*?\)\s*?;/is', 
               $script, $matches);

Parantez ve çift tırnak içinde yer konum eğer, DELETE deyimleri, olası tüm SELECT, INSERT, UPDATE eşleşmesi gerekir. Bu durumda insensetive bulunuyor ve çoklu hatları üzerinden yayılan ifadeleri aynı olmalıdır.

Dize atamaları gibi CRUD deyimi eşleşen için edit #1: Regex;

preg_match_all('/\$\w+\s*?=\s*?"(?:SELECT|INSERT|UPDATE|DELETE) .*?"\s*?;/is', 
               $script, $matches);

edit #2:

// $variable detecting version of #1 regex
preg_match_all('/\(\s*?"(?:SELECT|INSERT|UPDATE|DELETE) .*?(?:\$\w+){1}.*?"\s*?\)\s*?;/is', 
                   $script, $matches);