Nasıl veri dezenfekte mi?

8 Cevap

Bu i bugün (i aldım bir php kitaptan) kullanmak fonksiyonudur:

function escape($data) {
	return mysql_real_escape_string(trim($data), $this->linkid);	
}

But I feel like it could be safer. for example, maybe use htmlspecialchars. It always makes me paranoid. I've read that mysql_real_escape_string is bad and never to use it, but then i've also read it's the best way. Lots of confusion regarding data sanitizing when inserting them to the database.

Peki bunu nasıl yaparsınız? ve bunu yol artıları ve eksileri nelerdir.

8 Cevap

Siz kaçan iki farklı bahsediyoruz.

Bu MySQL göndermek için güvenli olacak böylece mysql_real_escape_string() verileri kaçar.

Bu HTML işler şey göndermek güvenli olacak böylece htmlspecialchars() verileri kaçar.

Her ikisi de kendi amaçları için iyi çalışır, ancak parameterized queries via something like mysqli biraz kıvrımlara vardır.

Lets have a quick review of WHY escaping is needed in different contexts:

If you are in a quote delimited string, you need to be able to escape the quotes. If you are in xml, then you need to separate "content" from "markup" If you are in SQL, you need to separate "commands" from "data" If you are on the command line, you need to separate "commands" from "data"

Bu, genel olarak işlem gerçekten temel bir yönüdür. Verileri sınırlayan sözdizimi VERİ oluşabilir, çünkü kaçan, dolayısıyla SENTAKSI gelen DATA farklılaştırmak için bir yol olması gerekir.

In web programming, the common escaping cases are: 1. Outputting text into HTML 2. Outputting data into HTML attributes 3. Outputting HTML into HTML 4. Inserting data into Javascript 5. Inserting data into SQL 6. Inserting data into a shell command

Her biri yanlış kullanıldığı takdirde farklı bir güvenlik etkileri vardır. Bu gerçekten önemli! En PHP bağlamında bu gözden geçirelim:

  1. Text into HTML: htmlspecialchars(...)

  2. Data into HTML attributes htmlspecialchars(..., ENT_QUOTES)

  3. HTML into HTML Use a library such as HTMLPurifier to ENSURE that only valid tags are present.

  4. Data into Javascript I prefer json_encode. If you are placing it in an attribute, you still need to use #2, such as

  5. Inserting data into SQL Each driver has an escape() function of some sort. It is best. If you are running in a normal latin1 character set, addslashes(...) is suitable. *mysql_real_escape_string() is better.* Don't forget the quotes AROUND the addslashes() call:

    "'= Tablo1 SET alan1 INSERT INTO". addslashes ($ veri). "'"

  6. Data on the command line escapeshellarg() and escapeshellcmd() -- read the manual

-- Take these to heart, and you will eliminate 95%* of common web security risks! (* a guess)

Evrensel bir cevap yoktur. Her zaman verileri depolamak olduğunuzu ne bağlı olmalıdır.

  • O bir numara olması gerekiyordu? Sonra is_numeric ile çalıştırın (ya da)
  • Bu HTML içerdiği için izin değil, bir dize var mı? Kullan htmlentities
  • vb

Aracılığıyla tüm verileri Koşu mysql_real_escape_string iyi bir fikirdir. Tabii ki bu da bir kod DB kütüphanesi veya PDO veya başka bir şey kullanarak bağlıdır.

Yerine mysql işlevi Örneğin, PDO ile, sizin için otomatik olarak bir şeyler kaçar gibi, $pdo->quote, ya da Zend_Db ifadeleri ile hiçbir şey kullanmak isterim.

Orada aslında bu metaproblem için is "evrensel cevap" (güvenli bir veritabanına kullanıcı tarafından sağlanan verileri depolamak): Eğer başlamak için tüm enjeksiyon sorunu önlemek için bağlama parametreleri kullanarak değilseniz, yanlış yapıyorsun.

Verileri Temizleme harika bir fikir, ama bir şey özleyeceğim şansı yüksektir. Yani, ne olursa olsun diğer yöntemleri kullanmak (ve Jani doğru, bu verilere bağlıdır), ihmal bağlama değişkenleri kullanarak etmeyiniz.

Passed data should never hit a query without being bound.

SOAP kullan? Har har.

(Uyarı: Evet, bu bir şaka)

Eğer hassas bir bağlamda koydum yalnızca önce verilerinizi Sanitaze gibi:

  • SQL sorgusu parçası
  • dosya veya yol parçasıdır
  • Bir kabuk komutunun parçası
  • (CSV gibi veya başka bir çıktı, XML, ATOM, vs, vs) HTML çıkış parçası

Ama öyle değil - Eğer veri güvenli olduğu hissi var olacak çünkü, bir genel kaçış işlevi kullanmayın. It güvenlik bağlamında bağlıdır. Ve açıkça yapamaz all anda kaçan, verileri kullanarak tüm durumların undependent. Yani veritabanında ham verileri tutmak (ve evet, örneğin PDO kullanarak, mysql_real_escape_string() veya parametre bağlama çeşit kullanın) ve bağlam içine koyarak ne zaman belirli kaçan işlevini kullanın:

  • htmlspecialchars() zaman HTML bağlamında
  • escape_shell_arg() ve escape_shell_cmd() zaman kabuk komut bağlamında
  • vs, vs
  1. Genel olarak, filter_var kullanın ()

  2. Çok özel biçimleri veya değerler sadece izin verilen durumlarda Regexes veya geçerli değerler İn_Array () kullanmak daha iyi olabilir.

  3. Unutmayın ki "giriş" anlamına gelir doğrudan kontrol etmiyoruz girdi any kaynağı.

  4. Giriş bir sorgu içine gidiyor ise, hazırlanmış deyimleri (örneğin, mysqli) kullanın

Veri (Jani Hartikainen yorumuna bakınız) geçerli ve / veya iyi biçimlendirilmiş emin yaptıktan sonra, gerçekten sadece PHP'nin yerleşik addslashes () çağrısı gerekir.