Kaçış MySQL için gerekli olduğunu bilmek nasıl

8 Cevap php

Ben CodeIgniter ile bir site oluşturma sürecinde yaşıyorum. Bu bir veritabanı ile etkileşim kendimi inşa ettik 1 sitedir. Ben bu proje için MySQL kullanıyorum. Veri veritabanına kaydetmeden önce kaçtı gerekiyor olmadığını nasıl anlayabilirim?

8 Cevap

Eğer query bindings ile database class kullanıyorsanız, herhangi bir manuel kaçışa yapmak zorunda değilsiniz:

The secondary benefit of using binds is that the values are automatically escaped, producing safer queries. You don't have to remember to manually escape data; the engine does it automatically for you.

Ben hazır deyimleri kullanmaya kendinizi alıştırmak için tavsiye ediyorum. Eğer veritabanları ile çalışan yeni, özellikle beri. Er, bu kullanmaya başlamak, o kadar kolay bir ikinci doğa haline gelir.

Ben veritabanları ile başladı ne zaman, örneğin, hazırlanan tablolar hakkında bilmiyordum. Onlarla temas geldi ve benim kendi stubborness yaşadı. Zaten şeyler yapmanın başka bir yolu kendimi alışık çünkü. Şimdi, bu kendinize bir karakter ticaret olmayabilir, ama en kısa sürede onunla sürede iki şekilde başlamak için zarar vermez.

Hazırlanan ifadeleri sorgularda tutucuları kullanmanıza izin verir. Bu tutucular sonra tutucuların onları bağlanarak gerçek değerler ile ikame edilebilir. Bu bağlama işlemi, otomatik değerleri kaçar.

İşte (basit) PDO örnek:

$db = new PDO( /* some database parameters */ );
$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
$statement->bindValue( ':username', $dirtyUsername );
$statement->bindValue( ':password', $dirtyPassword );
$result = $statement->execute();
// result checking ommited for brevity

PDO ve hazırlanan tablolar ile normalden çok daha fazla olasılık var. Örneğin kolayca gibi, bir döngü içinde hazırlanmış deyimi yeniden kullanabilirsiniz:

$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
foreach( $users as $dirtyUser )
{
    $statement->bindValue( ':username', $dirtyUser->username );
    $statement->bindValue( ':password', $dirtyUser->password );
    $result = $statement->execute();
    // result checking ommited for brevity
}

Ya şöyle, yürütmek yöntemine tutucu bağlamaları geçmek:

$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
$result = $statement->execute( array( 
                                   ':username' => $dirtyUsername, 
                                   ':password' => $dirtyPassword
                             ) );
// result checking ommited for brevity

... Vs, vs

(Eğer o kadar berbat OLACAK) kendinizi kaçan endişe etmeyin. Ilk deyimi hazırlamak nerede DB katmanı kullanın, ve sonra ona veri eklemek.

PHP kullanmanız gereken PDO. Yazdığınız

SELECT * FROM table WHERE key = :key AND value = :value

ve sonra işlevlerini çağırarak verileri ekleyin.

Veri bir dize ise, always öncelenmesi gerekir.

Ancak, yerine parametreleri kullanmak daha iyidir.

PDO gibi bir şey kullanarak SQL'ye kendinizi yerine üreten, o zaman always dizeleri kaçmak gerekir.

Dizeleri Kaçış SQL dilinin temel bir gerekliliktir. Her şeyin kötü gitmeden bir dize kesme veya ters eğik çizgi karakterleri gibi kullanmanıza olanak sağlar buydu. Tüm kaçan dizeleri gerekli değildir ki hiçbir durum yoktur.

Hatta olmayan dizeleri onlar, gerçekten, olmayan dizeleri olmasını sağlamak için filtrelenmiş gerekecektir.

Eğer öğrenme ise, ciddiye yerine kendi dizeleri kaçan daha PDO'de gibi bir şey gibi diğerleri söylediler öğrenme düşünün lütfen.

When in doubt, escape it all. Can't be too safe.

Tamam, tamam. Anladım

ALWAYS ESCAPE

Ipin herhangi örneğin, kullanıcı girişi yapıldığında nasıl bir MySQL sorgu dizesi kaçış:

in PHP: $username = ;//VALUE FROM USER INPUT

then your query string is: "INSERT INTO table ('username') VALUES (".$username.")"

Sen nedeniyle $ username değişkeni potansiyel olarak veritabanı içine enjekte edilecek istemci tarafından eklenen kötü niyetli kodlar olabilir aslında bu mySQL sorgu kaçmak olurdu.

Ne zaman kaçmak için? En kısa sürede sitenizin kamu gider.