Bu SQL sanitization kod açıklaması

5 Cevap php

Ben bir oturum açma formu öğretici için bu var:

function sanitize($securitystring) {
        $securitystring = @trim($str);
        if(get_magic_quotes_gpc()) {
            $securitystring = stripslashes($str);
        }
        return mysql_real_escape_string($securitystring);
    }

Bazı biri bu ne yaptığını tam olarak açıklayabilir misiniz? Ben 'temiz' var alanları sterilize sonradan kadar denir biliyorum; Yani $email = sanitize($_POST['email']);

5 Cevap

First of all, this code is wrong.
It has wrong meaning and wrong name.

No SQL data preparation code does any cleaning or sanitization. It does merely escaping. And this escaping must be unconditional. and escaping shouldn't be mixed with anything else.

Yani, üç ayrı fonksiyonları, biri olmalıdır.

  1. Sihirli tırnak kurtulmak. Veri girişi ayrı ayrı yapılmalıdır.
  2. isterseniz kırpın. Sadece metin beautifier, öyle kritik bir fonksiyon.
  3. SQL sorgusu için veri hazırlamak için () mysql_real_escape_string.

Yani, burada sadece mysql ile ilgili fonksiyon) (mysql_real_escape_string edilir. Hiçbir veri yapar rağmen "temiz", ancak sadece ayraçları önceleme. Bu nedenle, bu fonksiyon only, bir dizge olarak kabul hangi veri ile ve tırnak içinde kullanılmalıdır. Yani, bu iyi bir örnektir:

$num=6;
$string='name';
$num=mysql_real_escape_string($num);
$string=mysql_real_escape_string($string);
$query="SELECT * FROM table WHERE name='$name' AND num='$num'";

Bu örnek, yanlış ise:

$num=6;
$string='name';
$num=mysql_real_escape_string($num);
$string=mysql_real_escape_string($string);
$query2="SELECT * FROM table WHERE name='$name' AND num=$num";

$ Query2 bir sözdizimi hatası atmak olmazdı olsa bile, bu yanlış veri hazırlama ve mysql_real_escape_string burada hiçbir şey yardımcı olacaktır olduğunu. Yani, bu işlevi bir dize olarak tedavi verileri kaçmak için sadece kullanılabilir. herhangi bir veri türü için yapılabilir olsa da, bir dize olarak tedavi edilemez gibi LİMİT parametreleri gibi bazı istisnalar vardır.

Eğer varsa Temelde, sihirli tırnak, POST / OTURUM verileri özel karakterler otomatik (dize () addslashes uygulayarak aynı) kaçtı olacak açık. (Ben tam nedenleri niçin hatırlamıyorum rağmen) MySQL escape fonksiyonları PHP'nin addslashes () daha iyidir.

Ne kodu yapar php.ini dosyası bölü verilerden çıkarılır ve daha sonra MySQL işlevini kullanarak yeniden dezenfekte edilir eğer öyleyse sihirli tırnak, açık olup olmadığını kontrol etmektir. Sihirli tırnak üzerinde değilse, veri sadece MySQL fonksiyonu ile dezenfekte edilir ve geri yüzden eğik şerit gerek yoktur.

trim() tüm boşluklarla kurtulur, ve sihirli tırnak üzerine ise, eğik çizgi herhangi bir stripslashes() ile tırnak kaçtı kaldırılır. mysql_real_escape_string() güvenli bir mysql sorguda kullanılmak üzere bir dize hazırlıyor.

Burada kullanılan fonksiyonları için dokümanlar aşağıdaki gibidir: http://php.net/manual/en/function.trim.php, http://php.net/manual/en/function.get-magic-quotes-gpc.php, http://php.net/manual/en/function.stripslashes.php, http://php.net/manual/en/function.mysql-real-escape-string.php

mysql_real_escape_string dizeye ek SQL ifadeleri gömme bir saldırganın engeller gibi ' gibi karakterler, ters eğik çizgiler eklemek için dize öncelenişi kullanılır. Dize kaçan değilse, ek SQL eklenebilir. Örneğin, bu satırlar boyunca bir şey idam olabilir:

SEÇİN * col = 'test' ; DELETE * FROM tbl ; SELECT 'owned' tbl DAN

Yanlış hatırlamıyorsam eğer onun kullanımı artık önerilmez rağmen magic_quotes, kendi kaçan yok. Ayrıca, MySQL işlevi yapacak tüm SQL enjeksiyon saldırıları önlemek gerekir kaçan.

Bazı (eski) sunucuları magic_quotes sağlamıştır. İşte tüm harici girişi (sözde), bir MySQL sorgusu enjekte edilmek için onu kaçmak için değişmiş demektir. Bu yüzden O'Brian olur O\'Brian. Bu yanlış oldu PHP ekibi tarafından erken tasarım karardı:

  • Sen her zaman veritabanı sorgularını girdi enjekte gerekmez
  • Tüm DB motorları kaçış karakter olarak eğik geri kullanmayın
  • Arkaları ile tek tırnak kesme işaretleri kaçan bile MySQL için, yeterli değil
  • Sizin sunucu güvenliği devre dışı bir PHP ayarı dayanır

Bu yüzden magic_quotes olmadan koduna yol daha var. Sorun yeniden dağıtılabilir kodu ile gelir: Sunucunun etkin magic_quotes veya devre dışı olacak eğer bilemeyiz. Yani orijinal giriş kurtarmak eğer öyleyse, hiç kullanım stripslashes () (denemek için), () bunu tespit etmek onlar üzerinde konum get_magic_quotes_gpc kullanabilirsiniz.