SQL Enjeksiyon yoluyla girildi Giriş kod örneği, her ne kadar mysql_real_escape_string

6 Cevap php

Ben CodeIgniter'ı kullanın ve hack ile sorun yaşıyorsanız: (aşağıda giriş kodu SQL Injection yapmak mümkündür:

    function process_login()
{
    $username = mysql_real_escape_string($this->input->post('username'));    
    $password  = mysql_real_escape_string(MD5($this->input->post('password')));

    //Check user table
    $query = $this->db->getwhere('users', array('username'=>$username, 'password'=>$password));

    if ($query->num_rows() > 0)
    {
        // success login data

Ben mysql_real_escape_string yanlış kullanıyor muyum? ya da ne?

Takdir yardımcı olur!

6 Cevap

Attılar ne hayır muhtemelen SQL enjeksiyonu savunmasız değil değil. Getwhere () a stripslashes () yapıyor olabilir, ancak ben emin değilim.

Onun olasılıkla o uygulamanın başka bir yerinde SQL Injection olsaydı. Saldırgan, sizin extremely weak md5 () karma edinmek için bu güvenlik açığını kullanarak bu çatlak, ve sonra giriş olabilir. SHA2 ailesinin herhangi bir üyesi kullanın, sha-256 mükemmel bir seçimdir.

Siteniz tahrif edilmiş, sonra ben ciddiye sql injection olduğundan şüpheliyim. Onun zor web tahrif sql enjeksiyon sömürü otomatikleştirmek, ama mümkündür için. Ben tüm kütüphaneler ve yüklü uygulamaları tamamen güncel olduğundan emin olur. Eğer bir CMS veya forum var özellikle. Bir OpenVAS, herhangi bir eski yazılım bulursa görmek için sitenizin karşı tarar çalıştırabilir.

Database

Kodunuz tarafından bakılırsa ben not (06/12 gibi 2.0.2) en son sürümünü kullanarak CI görüyorum.

2.0 sürümü olarak terk edilmiştir (şimdi get_where() denir) changelog getwhere() fonksiyonu belirtildiği gibi. Orada arada bugfixes bir çok olmuştur ve her zaman mevcut en güvenli sürümü güvenmek gerektiği gibi
orada everty uygulamaya gelince size şiddetle, geçerli sürüm yükseltme önerdi ediyoruz.

mysql_real_escape_string usually is considered 'enough' to give a good level of safety in your queries, but as it happend to its predecessor (mysql_escape_string) it isn't 100% safe against all kind of attack, so relying interely on that is not the best practice around. Although safe, there are still attacks that can go past this filter.
Check, among the many, this question on SO for further information about this.

In codeignier: If you were developing your custom application, I'd suggest you to at least use the mysqli extensions or, better yet, the PDO class; prepared statements are undoubtely safest and should be favoured over everything else.

But we are in the framework context, and Codeigniter comes with 3 great ways of safely querying your database, applying the right tool to the right input without you having to worry about that. I'm talking about query bindings and manual escaping with $this->db->escape() family and the Active Record Class
You can find examples of use at the urls I just linked, or read the answers from other peers here, so I won't go into the details of each procedure in this post.

Password

Parolanızı ile ilgili olarak, zaten diğer kullanıcılar tarafından belirtildiği, md5() a şimdi kusurlu karma alghoritm olduğunu. Orada gökkuşağı tabloları orada zaman görece kısa bir miktarda sizin md5 şifrenizi çatlak vardır, böylece sha1() veya sha256, sha512, and other gibi yüksek güvenlik düzeyi karma algorhytms, ile daha iyi

In codeigniter: Codeigniter comes with a security helper class, which provides you with a handy function, do_hash() (might be dohash() in your older installation), which can be given the hashing alg. as paramter (currently I think it supports only md5 and sha1) and defaults to sha1() anyway.

Other observations

Ben size, SQL enjeksiyonu için giriş suçu neden tamamen net değilim. Bu bütün uygulama sadece 2 formları vardır?
Eğer $ _GET parametrelerini kullanın veya yerel URI segmentasyonu takip ederseniz anlatmak için bilgi sağlamak dind't, ama ben bu yüzden bu bakış güvenli konum varsayalım böyle yapıyoruz inanıyorum.
/> aksi takdirde istediğiniz ne kadar giriş güvenli, emin sonra başka hiçbir giriş formu giriş veritabanına girmeden içeren web var ki yapmak gerekir, ama birisi bir zemin üzerinden nüfuz ve okumak oradan veritabanı tablosu ve "meşru" bir şekilde web sitenize giriş olsun.

Ayrıca, örneğin, bir compromized çerez gibi, saldırı başka bir kaynak olabilir. Tavsiye, bir çerçeve kullanmayı tercih (ve kendinizi kendiniz sıfırdan ve tüm gelişmekte olan daha büyük bir iyilik yapıyoruz) ne zaman aşağı güvenlik söz konusu expecially, onun özelliklerinden ÇOK kullanma eğiliminde gereken bir parça olarak. Bu çok büyük ve çok hassas bir soru, yani MUST Bu konu en üst öncelik vermek, ve büyük bir topluluk ve sık güncellemeler ile iyi geliştirilmiş bir çerçeve, alabilirsiniz emniyete için yakın.
Therefore, you're adviced to update CI kurulum (kılavuzlar here kendi kılavuzunda bulunabilir. Sürümünü seçin ve talimatları izleyin), hep Don her görev için verilen konum üst araçlarını kullanın ve 't kapıyı engelleme windows bir saldırı güvenli yapacak düşünüyorum. Her zaman iyice kontrol edin ve tüm possibile nedenlerini araştırmak.

Late Addendum: XSS, CSRF, oturum tespitler ve diğer sıcak güvenlik sorunlarını unutmayın.

Bu devam eden bir hack ise, o zaman ciddi bir yerde bir dosya adı / parola kaydetmek için yerinde bazı günlük koyarak düşünün. Bu giriş pasajı yoluyla bir SQL enjeksiyon ise, o zaman bir yerde bu yeni günlük dosyasında göstermek istiyorum. Eğer Ve bunu yaparken, hem de oluşturulan SQL sorgusu log.

Her durumda, bu mysql_real_escape_string () sadece mysql'in metakarakterlerini kapsar hatırlıyorum: tek tırnak, çift tırnak, noktalı virgül, vs .. Bu bir boolean parametre bozma yoluyla giriş fonksiyonunu kesmek için hala tamamen mümkündür. Imkansız "getwhere" fonksiyonu savunmasız olup olmadığını söylemek, ancak gönderilen şifre "xyz OR (= 1 1)" olan davayı dikkate. Oluşturulan sorgu gibi bir şey arıyor sonunda olabilir

 SELECT id FROM users WHERE users=someusername AND password=xyz OR (1=1);

Bu kritik metakarakterlerin herhangi içermiyordu çünkü mükemmel geçerli sorgu ve aynı zamanda sağlam mysql_real_escape_string geçti.

Tüm fonksiyonları ve erişimciler isimleri önermek görünüyor ne yaparsanız, o zaman bu komut SQL Injection savunmasız değildir.

Düzgün mysql_real_escape_string kullanarak olup olmadığını gelince ... evet ve hayır. Evet, doğru bir fikir var, ama aslında aşırı kullanıyoruz. Eğer şifreyi MD5 varsa, o girdi artık temiz ve enjeksiyon için kullanılamaz, böylece mysql_real_escape_string çağrı gereksiz olduğunu. Yani bu iyi olurdu:

$username = mysql_real_escape_string($this->input->post('username'));    
$password  = MD5($this->input->post('password'));

Önceden bahsedildiği üzere, MD5 kendisi tarafından oldukça zayıf bir karma algoritma. SHA ve bir karma tuzlama içine bak.

Kullanıcı girdileri "xyz OR (= 1 1)" şifre olarak, bu iki nedenden dolayı onun komut dosyası kesinlikle hiçbir tehdit oluşturmadığı takdirde, yayınlanan bir önceki cevabı karşı.

1) MD5 hash SELECT id FROM users WHERE users='username' AND password='d131dd02c5e6eec4693d9a0698aff95c'; çizgisinde sorgu şey yapma, zararsız bir karma (örn. 'd131dd02c5e6eec4693d9a0698aff95c') bu dönüştürmek istiyorsunuz

2) önler 'string' enjeksiyonları mysql_real_escape_string, o beklenen SQL sorgusu çıkmak için bir tek veya çift tırnak gerektiren enjeksiyonları, ancak tip-kullanmanız gerekir sayısal girişi ile) (örneğin enjeksiyon engellemez engellemek için döküm.

Her şey "$ this-> db-> getwhere" çağrısı gerçekten şarta. Bu sadece bu komut sadece savunmasız değildir (tırnak soyma, ya da vb, [zaten bir hata atmak] tamsayılar olarak dizeleri tedavi gibi) funky bir şey yapmadan normal sorgusu oluşturur eğer. Eğer yaşadıysanız hack 'tür' hakkında daha fazla bilgi vermek olsaydı, biz muhtemelen nereye bakmak için bazı ipuçları verebilir. Eğer tahrif edildi?

Ben CodeIgnitor ile oynadı, ancak kendi giriş / veritabanı fonksiyonları inşa böyle garip bir şey olmaz beklemek değil - düzenlediğiniz bu yüzden sürece kendinizi işlev getwhere, muhtemelen bu belirli noktada iyiyiz.

Active Kayıtlar sizin için uygun değerleri kaçış olacağı benim anlayış. Yani, ile $query = $this->db->getwhere() Eğer mysql_real_escape_string() kullanmanız gerek yok.

Ama, her zaman Kontrolör doğrulama çeşit kullanmalısınız. Özellikle, normal bir ifade üzerinden belirli karakter adınızı ve şifrenizi sınırlayabilir. Bu her zaman önerilmektedir.

Tipik saldırıları ile kazaya Ayrıca, eğer sık ​​sonra PHPIDS kullanarak içine bakmak. Bu çeşit bir hata veya bildirimi atılmış olabilir gibi, aslında herhangi bir hasara neden olan saldırıları önlemeye yardımcı olacak bir Saldırı Tespit Sistemi bulunuyor.

You may also wish to view this tutorial on Security issues. http://net.tutsplus.com/tutorials/php/codeigniter-from-scratch-security/

Kod enjeksiyon saldırılarına karşı dayanıklı görünüyor. Bu alana herhangi bir enjeksiyon saldırısı bırakır parola alanının md5 alıyor. Savunmasız alan, zaten kaçan adınız. Eğer bu bir enjeksiyon saldırısı olduğundan emin misiniz?

CSRF önlemek için birlikte geçirilen access_token alanları gibi herhangi başka bir alan var mı

Aşağıdaki garip davranış muhtemel nedenleri şunlardır:

  • Siz veritabanı config mysqli sürücüsü kullanıyorsanız ve mysql lib göre dize kaçan. mysql_real_escape_string ikinci parametre olarak $this->db->conn_id sağlayan deneyin ve uyarılar için php günlüklerini denetleyin.
  • mysql_real_escape_string ihtiyaçlar connection link identifier, ikinci parametre olarak. Eğer vermezseniz size garip davranışlar yaşayacaksınız. Ben CodeIgniter ile bu acı çekti. Benim durumumda mysql_real_escape_string boş dizeler dönüyordu. Durumda sizinle aynı ise, (çok az muhtemel) Eğer Kullanıcılar tablosunun boş şifreleri ve kullanıcı adları yok edin.