mysql_real_escape_string () kullanın ama apostroplarla isimlere izin

3 Cevap php

Ben bir sql veritabanında onları takmadan önce tüm kullanıcı girişlerini doğrulamak için () mysql_real_escape_string kullanın. Alanlardan biri adıdır ve biz O'Reilly gibi isimler ile kullanıcılar ile sorunlar yaşadım. Enjeksiyonları engellemek ancak db bu isimlere izin mysql_real_escape_string () kullanmak için herhangi bir yolu var mı?

3 Cevap

Sorun kesme işaretleri iki alıntı olsun muhtemeldir: İlk kötü ve 5.3 önerilmiyor magic quotes tarafından ve o zaman mysql_real_escape_string().

Ne yapabilirim ya da bir disable magic quotes veya çalışma stripslashes() on your input values before mysql_real_escape_string() onları besleme

Sorunun kısa açıklaması:

  • kullanıcının girdiği O'Reilly
  • sihirli tırnak otomatik olarak O\'Reilly çevirmek
  • script both ters eğik çizgi ve kesme işareti (tekrar) elde kaçar mysql_real_escape_string yoluyla dize () beslemeleri O\\\'Reilly
  • sorgu yürütüldüğünde, alıntı işlenmiş ve veritabanı bir ters eğik çizgi ikisi kaçtı nerede beri and, bir kesme işareti ve kayıtları istediğiniz anlar O\'Reilly

Zaten Mentionned: mysql_real_escape_string giriş doğrulaması için bir anlamı yoktur. Eğer girişleri doğrulamak istiyorsanız, php kendi işlevlerini veya filter functions kullanın.

Eğer php tarafından otomatik olarak eklenen çok sayıda bölü varsa, sihirli tırnak devre dışı bırakın.

SQL enjeksiyonu önlemek için, ya PDO veya mysqli ile parametreli sorgularını kullanabilirsiniz.

PDO kullanarak için +1. Ben şimdi bir kaç ay için bir veritabanı soyutlama katmanı olarak bir MySQL sınıf oyunculuk lehine PDO kullanarak oldum ve bir esinti.

Geleneksel olarak, geliştiriciler mysql_real_escape_string() gibi bir işlevi uygulamadan önce veri üzerinde stripslashes() işlevini kullanın. Bu veri girişi slashes kaldırmak için hala iyi bir fikir, ama sonra (PDO::quote($data)) verileri kaçan veya parametre bağlama için PDO yöntemini kullanabilir ya.

Sorgunuz blok sonra bu gibi bir şey olacaktır:

$pdo = new PDO(DSN, DB_USER, DB_PASS);
$sql = "INSERT INTO table (field1, field2) VALUES (:value1, :value2)";
$smt = $pdo->prepare($sql);
$smt->bindParam(':value1', $value1, PDO::PARAM_STR);
$smt->bindParam(':value2', $value2, PDO::PARAM_STR);
$smt->execute();
$rows = $smt->rowCount(); // returns number of rows affected

Ben bu biraz yardımcı olur umarım. PHP PDO hakkında daha fazla bilgi için http://php.net/manual/en/book.pdo.php bir göz atın.