Nasıl PHP $ _POST bir mysql_query fonksiyonu vars yazmak gerekir?

5 Cevap php

Benim veritabanına erişimde, ben kullanıcı bir form doldurmak zorunda, ve hedef sayfa, yayınlanan değerler çıkan MySQL sorgusu kullanılır.

$query = mysql_query("SELECT pass FROM database WHERE user='$_POST[user]'");

Ancak, bazı veya başka bir nedenle, MySQL benim komutunda $ _POST değişkeni kullanarak, ve ben (örneğin) tanımlarsanız sadece $user = $_POST['user']; çalışır ve daha sonra doğrudan $ kullanıcı koymak sevmiyor SQL komutu.

Öte yandan, ben belirli bir sütun isimleri gerekmez INSERT deyimleri $ _POST değerlerini kullanabilirsiniz:

$query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', '$_POST[user]'");

Ben nitelikleri tanımlanan bir INSERT deyimi çalışırsanız (örneğin, user='foo'), daha sonra aynı sorun görünür.

Ben çalıştırdığınızda komut yerine hataya neden olur, ancak bir INSERT komutu biçimlendirme özgü yöntemi ile çalışır benim SQL sorgusunda yanlış ne yapıyorum?

Umarım, "size gönderilen tüm değerleri atamak zorunda gibi sert şans görünüyor" değil. Heh.

5 Cevap

Öncelikle, watch out for SQL Injections !

Şimdi, soru cevap yerine bunu deneyin:

$query = mysql_query("SELECT `pass` FROM `database` WHERE `user` LIKE '" . mysql_escape_string($_POST['user']) . "';");

Yanlış bir kaç şey yapıyorlardı:

  • = operatörünü kullanarak yerine LIKE operatörü
  • ' ile SQL sorgusunda değeri çevreleyen değil
  • ' ile $_POST dizi, kullanıcı dizini içine değil

PS: You should use mysql_real_escape_string() instead of mysql_escape_string() !

Sadece bir dize içine bir değişken takıyor, bu nedenle içine koyuyorduk hangi komutu önemli olmamalı.

Işaret gereken bazı konular vardır.

Bir, dizi değişkenler için {} biçimini kullanmak isteyebilirsiniz. Bu formatta arrray anahtar adları tırnak kullanmayın.

$query = mysql_query("SELECT pass FROM database WHERE user='{$_POST[user]}'")

İki, you'd never want to make a query like that SQL enjeksiyon delikleri açıktır çünkü. Düşünün, ne $ _POST ['user'] ise "inek '; tablo veritabanı bırakın; -"?

Eğer sorgu içine koymadan önce POST girişi mysql_real_escape_string çalıştırmak veya hazırlanmış tablolar ile PHP PDO ile kontrol gerekir ya.

Yapısının biraz sağlar sizin dize biçimlendirmek yapmanın bir yolu sprintf'i kullanmaktır.

$query=mysql_query(sprintf("SELECT pass FROM database WHERE user='%s'",mysql_real_escape_string($_POST['user'])));

Neden kontrol () bu konuda söylediklerini mysql_error görmüyor? Sorgu geçersiz ise, mysql_error () yanlış gittiğini tam olarak ne olduğunu anlatan bir metin güzel bir damla dönecektir.

Başkalarının bazı çalışır doğrudan takın, ama eğer MySQL POST VAR sevme değil gelince, o size her test için tutarlı veri ve kurulumları kullandığınızdan emin olun. Bazı test bir GET kullanarak yapılır, o zaman POST değişkenler boş olacaktır. Her test için farklı kullanıcı adları kullanarak ediyorsanız başarısız olanlar arasında tutarlı ne ise, o zaman bakın.

Ve yukarıda da belirtildiği gibi, SQL enjeksiyon hakkında okumak ve nasıl sorgu sadece kötü niyetli bir kullanıcı tarafından yıkılabilir için yalvarıyor.

  1. Kullan PDO - bu DB ile iletişim kurmak için çok daha iyi bir API sağlar.
  2. Eğer kullanıyorsanız mysql_*() fonksiyonları her zaman (kullanıcı) gibi güvenilmeyen bir kaynaktan gelen filter (mysql_real_escape_string()) herhangi bir veri unutmayın
  3. Kod gibi görünüyor nasıl daha fazla dikkat. Sadece aşağıdaki listeleri karşılaştırmak:

    $query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', " . mysql_real_escape_string($_POST['user']) . ", " . mysql_real_escape_string($_POST['user']) . ", " . mysql_real_escape_string($_POST['user']) . ", " . mysql_real_escape_string($_POST['user']) . ")");
    
    
    $query = sprinf('INSERT INTO database VALUES ("foo", "bar", "%s", "%s", "%s")',
    mysql_real_escape(...), ...);
    

    Ben hangisini okuyabilir, değiştirebilir veya anlamak daha iyidir açıklamak zorunda mıyım?

Denemek

$query = mysql_query("SELECT pass FROM database WHERE user=" . mysql_real_escape_string($_POST['user']));

ve

$query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', " . mysql_real_escape_string($_POST['user']) . ")");

Şey sterilize etmek için onun her zaman iyi bir fikir $ _GET veya $ _POST üzerinden alınan