Mysql_real_escape_string () TAM SQL enjeksiyon karşı koruma sağlar mı?

3 Cevap php

On http://www.justinshattuck.com/2007/01/18/mysql-injection-cheat-sheet/?akst_action=share-this, bazı Asya karakter kodlamaları ile mysql_real_escape_string atlayabilir iddia eden bir bölüm var

BIG5 veya GBK ile mysql_real_escape_string () Atlayarak

"injection string"
に関する追加情報:

Yukarıdaki karakter Çin Big5 vardır

Bu gerçekten doğru mu? Ve böylece eğer hazırlanan tablolara erişimi olsaydı, nasıl, bu karşı web sitenize korumak istiyorsunuz?

3 Cevap

Stefan Esser göre, "mysql_real_escape_string() SET NAMES kullanıldığında güvenli değildir [dir]. "

Yaptığı açıklama, from his blog:

SET NAMES is usually used to switch the encoding from what is default to what the application needs. This is done in a way that mysql_real_escape_string doesn’t know about this. This means if you switch to some multi byte encoding that allows backslash as 2nd 3rd 4th… byte you run into trouble, because mysql_real_escape_string doesn’t escape correctly. UTF-8 is safe…

Kodlamasını değiştirmek için güvenli bir yol mysql_set_charset, ama bu yeni PHP sürümlerinde kullanılabilir

O olsa, UTF-8 güvenli olduğunu belirtmektedir.

Bu bildirildi şekilde geri Mayıs 2006 giderilmiştir MySQL sunucu hata.

Bkz:

  • MySQL bug #8303: \ içeren çoklu-bayt karakterler ile Dize hazır yanlış lexed edilir
  • MySQL Bug #8317: sorguda Karakter seti İntroduser bağlantı karakter kümesini geçersiz başarısız
  • MySQL Bug #8378: String istemci karakter kümesi 'GBK' ile yanlış kaçtı
  • MySQL 5.1.11 changelog.

Hata MySQL 4.1.20, 5.0.22, 5.1.11 giderilmiştir bildirildi.

Eğer 4.1.x, 5.0.x, 5.1.x ya da kullanıyorsanız, en azından küçük revizyon numaraları yükseltilmiş emin olun.

Geçici bir çözüm olarak, aynı zamanda bir alıntı-kaçış karakteri olarak ters eğik çizgi devre dışı bırakan NO_BACKSLASH_ESCAPES SQL modunu etkinleştirebilirsiniz.

Ben karakter kodlamasını değiştirmek için SQL kullanırsanız sadece çalışmaz eminim.