SQL injection bugün bir risk var mı?

19 Cevap php

I've been reading about SQL injection attacks and how to avoid them, although I can never seem to make the "awful" examples given work, e.g. this post http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain

Ben bir php dosyası oluşturulur ve veritabanı bir tablo, $_GET geçirilen bir değeri vardı ve bob'); drop table students; -- yaparak tabloyu silmek ve onu işe yaramadı çalıştı. PHP otomatik olarak \' kaçar ve sorgu bir hata, hiçbir zarar verdi. AND WHERE 1=1 vb login "saldırıları" çoğaltmak için çalışırken aynı sorun olduğunda

Örnek kod:

<?php
$id = $_GET['id'];

$sql = "INSERT INTO Users (Username) VALUES ($id)";
echo $sql;
mysql_query($sql) or die(mysql_error());

Ve ben sql.php?id=1); delete from Users; -- geçerdi

Yani bu Php3 falan gün içinde uygulamak için kullanılan bazı tarihli bir şeydir, ve günümüzde bile acemiler sihirli tırnak gibi şeyler korunur?

Ben Ubuntu PHP5 kullanıyorum.

19 Cevap

Oldukça aykırı. Onlar programlama dünyaya daha fazla karışıklık getirdi Magic quotes are deprecated in PHP5 and will be completely removed in PHP6, onlar iyi mi daha. Sihirli tırnak aktif olup olmadığını kontrol etme ve titizlikle herhangi bir SQL giriş kaçan gerekirse, hala çok önemli ... kötü hissetmek için bir neden yok olsa, hepimiz orada oldum ve benim habersiz eşek sihirli tarafından kaydedildi sayısız tırnak kez :)

Sihirli tırnak üzerinde PHP kılavuzu her şeyi açıklıyor: http://www.php.net/magic%5Fquotes

Hayır, bu hala çok önemlidir.

Gibi XSS ve CSRF vardır. Uygun giriş filtreleme önemini hafife asla.

Tarihinin en büyük kimlik hırsızlığı bir SQL enjeksiyon açığı kullanarak 2007 yılında elde edildi: "SQL injection attacks led to Heartland, Hannaford breaches (bkz." ComputerWorld, 8/18/2009).

OWASP reported in 2007 bu enjeksiyon saldırıları (SQL enjeksiyonu bir örnek olduğu) en yaygın yazılım güvenlik sorunlarından biri olmaya devam etmektedir.

Ayrıca son SQL enjeksiyon haber aramak ve birçok durumlarda bulabilirsiniz her ay rapor: http://news.softpedia.com/newsTag/SQL+injection

Ancak, XKCD karikatür örnek mutlaka istismar en yaygın türü değil. Tek isteği, ikinci bir SQL deyimi yürütme tarafından bir tablo bırakarak muhtemelen değerli veri yolunda çok saldırganın kazanç olmaz, sadece vandalizm olurdu.

Ayrıca, bazı sorgu arayüzleri zaten varsayılan multi-query vermemek. Bu veritabanı istemci API ne olursa olsun noktalı virgül, SQL dizesi verilen tek bir deyim yürütür, olduğunu. Bu karikatür gösterilen örnek yendi.

note: PDO'su query() yöntemi varsayılan olarak support çoklu sorgu bilinmektedir. Yani is XKCD tarzı saldırı duyarlı.

Diğer millet işaret gibi, daha büyük olasılıkla risk SQL Injection SQL ifadelerin mantığı değiştirmek ve amaçlanan dışında ekstra satır için sorgu geçerli olacaktır.

Örneğin:

$sql = "UPDATE Users SET PASSWORD = MD5('" . $_POST["password"] . "'||salt) " . 
       "WHERE user_id = " . $_POST["userid"];

I userid dizeye ayarlanmış parametre ile bir istek göndermek ne olur 123 OR userid=456? Ben kendi şifrenizi (userid 123) yanı sıra adınız 456 şifresini sıfırlamak olacaktır. Hatta bu karşı korumak olmaz bir kullanıcı başına tuz ile şifreyi karma. Şimdi hesabıyla giriş yapabilirsiniz.

Yolları SQL enjeksiyon sürü vardır işlenen olabilir.

Magic tırnak dikkate karakter kodlaması almak ve böylece multi-byte karakterleri dayalı saldırılara karşı savunmasız değilsiniz.

Bugün risk olduğu için olarak Google, arama sayısız savunmasız siteleri açmak. Bir SQL Injection güvenlik açığı Bugzilla 10 Eylül etrafında bildirildi. Yani, evet, siteler hala risk altındadır. Onlar olmalıdır? Araçları enjeksiyonu önlemek için vardır, bu yüzden hayır.

Mysql_query tek bir deyimi yürütme gibi belirli saldırı, çalışmıyor.

Hala olsa kodunuzu kötüye olabilir, örneğin id olması için ben düzenlenmiş eğer SELECT password FROM Users WHERE Username='admin' Ben bazı iç bilgiler açığa sistem elde edememek bir şans olabilir.

Eğer SQL içine filtresiz girişini izin Temelde, hem veri sen beklemiyorduk oluşturma ve niyetinde değildi verilerin ortaya bazı çok yaratıcı yollar olacak!

Aman .. SQL Injection bir gaping security hole olan, bir risk değildir. API SQL sorguları eski verilerinizi sokmak istiyorum yapar çünkü esas olarak php var.

PHP veya ASP ile yazılmış bir site gördüğünüzde, ben sadece onlar kokuyorsun SQL injection vektörleri kokusunu alabiliyorum. İnsanlar mysql_real_escape_string() ve intval() ile PHP uygulamaları güvenli ve diğer dillerde benzer yapmaya çalışın. Bu bir hatadır. Bu eski, sen bir hata yapmak ve ölürsün nereye yerine Java veya Python, ve C kodlama gibi, ama ikincisinde, sadece anlamsal kusurları var olabilir.

Ben kuvvetle insanlar koduna metin yerine, hazırlanan tablolar ile mysqli veya parameterized else şey ya da kullanmak için çağırıyorum ve o ilk yer IMHO sadece kötü bir uygulamadır yorumlama.

Bir başka not, PHP'nin sihirli tırnak sadece aptalca olduğunu ve minnetle, önerilmemektedir. Sadece yarardan çok zarar verebilir. Eğer sihirli tırnak güveniyor, o sihirli tırnak devre dışı olduğunda app ait olacak demektir. Benzer şekilde, bu girdilerin kaçmış dizeleri beklemeyin diğer uygulamalar kırılabilir.

Bu çok aktif bir risk olduğunu, sihirli tırnak bir çözüm vermek için çalışır ama sihirli tırnakları ile her zaman geliştirmeyi tercih. Bu şekilde ben aslında girisleri kendim kaçmak emin olmak gerekir. Sihirli tırnak aslında script dağıtıldığı sunucu üzerinde açık ya da kapalı olacak kim bilir.

Bu hala büyük bir sorundur. Sen magic_quotes kullanmak olabilir her PHP kurulumu açık olduğunu kabul edemeyiz.

Sihirli qotes açık olup olmadığını görmek ve sihirli tırnak gelen karışıklık temizlemek için:

if ( get_magic_quotes_gpc() !== 0 ) { $foo = stripslashes( $foo ); }

Sonra ifadeleri temizlik biraz:

$foo = mysql_real_escape_string( $foo );
$sql = "select * from foo where bar='{$foo}'";

vb

Aslında, bunu yapmak için yetenek varsa sadece kesinlikle magic_quotes dönüm daha iyiyiz.

Ben size yardımcı olur umarım.

O bir çağrıda birden sorguları yapmaz çünkü Bobby tablolar örnek mysql arayüzü ile çalışmaz. Mysqli arayüzü birden fazla sorgu saldırıya açıktır. Mysql arayüzü ayrıcalık artırmak saldırıya karşı daha savunmasız olduğunu:

Formdaki ben hesabını yazın: admin şifre: ' or 1=1 --, böylece tipik giriş SQL: select * from users where user_name = '$admin' and password = '$password'. Ya bu doğru ve içeri giriş izin olur

PHP sorgu parametreleri yapamaz? (O olmasaydı ben şaşıracaksınız gibi), bu TÜM SQL enjeksiyon saldırıları azaltır bir çözümdür eğer.

Ben daha önce üzerinde stackoverflow birkaç kez söylediğim gibi, ben yapmak, sadece eski moda mysql kullanarak durdurmak, PDO güçlü bir destekçisi kendiniz and your clients büyük bir iyilik ve PDO (gerçekten kolay) öğrenmek ve yararlanmak Hazırlanan tablolar ve bağlı parametreleri. Eğer hazırlanan tablolar performans akıllıca gerekmez bile, yine güvenlik faydaları olsun.

Ayrıca, ben sihirli tırnak üzerinde ayarlı ise müşteriler yüz içinde tüm app çökmesini önerecektir. Bu aptal korumak ve akıllı kızdırmak için tasarlanmış kaynakların sadece bir drenaj bulunuyor. (Her şeyi kodlar çünkü bunu gerekmez bile, elle kaçan fazla cpu kullanır)

SQL Injection ve temel güvenlik önlemlerini aşmak için yollar oldukça çok gerçekleştirmek için farklı yollar bir yeri vardır.

Bu saldırılar (rank # 2) OWASP göre en iyi 10 web uygulama açıkları içinde olmuştur.

http://www.owasp.org/index.php/Top_10_2007-A2: Daha fazla bilgi için, lütfen bkz

Hayır, az SQL Injection hakkında endişe, daha büyük olasılıkla onun tarafından vurulmak için vardır.

Ofen web sayfalarından sql sorguları geçirilen parametreler sayısal kimlikleri olma eğilimindedir. Örneğin diyelim ki bir bölüm kimliği böyle bir sorguda kullanılan hangi bir url http://foo.com/page.php?section=34 var varsayalım:

SELECT content FROM sections WHERE section_id=$section;

Sizin örnekte gibi kaçmak için ve URL numarasından sonra koyacağım neyse yok tırnak sorgusuna geçilecek ... Yani thew risk gerçek.

Başparmak basit kuralı tüm kullanıcı girişi kusurlu olabilir olduğunu kabul etmektir. Bu veri türleri nelerle kontrol edin, değişkenler uzunluğu / boyutu sizi bekliyorduk aralıkları vardır, dosyası olmayan dış verilere Diğer kontroller garanti edilebilir, izin boyutu ve türleri, vb - bazı önemli admini aramadan önce -düzey işlevi, bir kontrol yapmak - ($ userlevel = YÖNETİCİ!) die ():? important_function ();

Büyük balık, ya da daha büyük bir pislik birileri her zaman var. Veriler hakkında varsayımlar kaçının ve bir başlangıç ​​var.

Dizeleri SQL kadar bina zaman, SQL enjeksiyon gerçek bir tehlikedir.

Ben de dizeleri SQL kadar bina önlemek için çalışıyor anlamsız bir çaba olduğunu keşfettiler. Er ya da geç SQL (parametre olabilir sadece şeyler) tam şeklidir zamanında oluşturulan gerekir.

Bana magic_quotes devre dışı bırakmak için bir yol vardır, bir sunucu için geliştirmek zorunda ettik! Ben sihirli tırnak etkilerini geri almak için her sayfada bu içerir, bu yüzden \ 'çifte öncelemeli \' olmadan kendim kaçan doğru yapabilirsiniz. Ben sadece bu okuma kusmuk tadı olsa bile, ben daha iyi bir çözüm bulamadı.

if (get_magic_quotes_gpc()) {

    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);

    while (list($key, $val) = each($process)) {

        foreach ($val as $k => $v) {

            unset($process[$key][$k]);

            if (is_array($v)) {

                $process[$key][stripslashes($k)] = $v;

                $process[] = &$process[$key][stripslashes($k)];

            } else {

                $process[$key][stripslashes($k)] = stripslashes($v);

            }

        }

    }

    unset($process);

}