PHP kod enjeksiyon saldırıları önlemek için nasıl?

5 Cevap php

Ben kafa karıştırıcı abot duyuyorum, PHP pek çok işlevleri vardır, ve bazı bazı bu kullanarak, bu kullanarak. Bazı insanlar kullanın: htmlspecialchars(), htmlentities(), strip_tags() vs

Hangisi doğru biridir ve siz genelde ne kullanabilirim?

Bu (eğer varsa, daha iyi biri bana tavsiyelerde) doğrudur:

$var = mysql_real_escape_string(htmlentities($_POST['username']));

Bu hat MySQL enjeksiyon ve XSS attact önleyebilir?

Btw, is there any other things I need to pay attention beside XSS attack and MySQL injection?

EDIT

Sonuç olarak:

Ben veritabanı dize eklemek isterseniz, ben, sadece kullanmak htmlentities mysql_real_escape_string kullanmak gerekmez. Verileri görüntülerken, htmlentities(), hepiniz ne demek olduğunu kullanabilir?

Özetler:

  • Veritabanına eklediğinizde mysql_real_escape_string kullanılır
  • Web sayfasına veri çıktısı alınırken htmlentities() kullanılır
  • htmlspecialchars() kullanılır?
  • strip_tags() kullanılır?
  • addslashes() kullanılır?

Biri soru işareti doldurabilir miyim?

5 Cevap

mysql_real_escape_string used when insert into database  
htmlentities() used when outputting data into webpage
htmlspecialchars() used when??
strip_tags() used when ??
addslashes() used when ??

htmlspecialchars() used when??

htmlspecialchars kabaca Htmlentities aynıdır. farkı: karakter kodlamaları.

<, >, & ve böylece vb etiketleri açmak için kullanılan olduğu gibi kodlamak kontrol karakterleri hem htmlentities da umlauts, euro-semboller gibi diğer dillerden karakter kodlamak ve bu gibi. web siteleri utf ise, aksi htmlentitiesi kullanın (), htmlspecialchars () kullanın.

strip_tags() used when ??

htmlspecialchars'ın / kişiler özel karakter kodlamak, bu yüzden displayed but not interpreted konum. strip_tags onları kaldırır.

pratikte, yapmanız gereken ne bağlıdır.

Bir örnek ... Bir forum kodlu ve onlar şeyler yazılan böylece kullanıcılara bir metin alanını vermek ettik. kötü niyetli olanlar sadece deneyin

pictures of <a href="javascript:void(window.setInterval(function () {window.open('http://evil.com');}, 1000));">kittens</a> here

Eğer bir şey yapmazsak, bağlantı display'd olacak ve linke tıkladığında bir kurban pop-up bir sürü alır.

Eğer htmlentitiy / htmlspecialchar çıkış durumunda olduğu gibi, metin olacak. Eğer strip_tag eğer, sadece etiketleri kaldırır ve görüntüler:

pictures of kittens here

<b> (strip_tags orada belirli etiketleri bırakabilirsiniz) gibi bazen, orada bazı etiketleri bırakın, bir karışım isteyebilirsiniz. Bu nedenle daha iyi xss karşı bazı tam şişmiş kütüphane kullanımı, çok güvensiz

addslashes

php manuel alıntı:

Bu karakterler tek tırnak ('), çift tırnak ("), ters eğik çizgi () ve NUL (NULL byte) vb veritabanı sorgularını kote edilmesi gereken karakterden önce ters eğik çizgi ile bir dize döndürür.

Bir veritabanına veri girerken yaparken addslashes () kullanımına bir örnek olduğunu. Örneğin, bir veritabanına isim O'Reilly eklemek için, bunu kaçmak gerekir. Eğer does't kullandığınız DBMS bir kaçış işlevi vardır ve DBMS özel karakter kaçmaya \ kullandığı takdirde son derece, (PostgreSQL için MySQL veya pg_escape_string () örneğin mysqli_real_escape_string ()) DBMS özgü kaçış işlevi kullanmak için recommeneded, ama oluyor bu işlevi kullanabilirsiniz.

HTML görüntülenirken bir veritabanı ve Htmlentites eklerken sadece () mysql_escape_string kullanmanız gerekir. Basit bir enjeksiyon saldırıyı önlemek istiyorsanız bu yeterlidir, ancak bir web uygulaması, çapraz site istek sahtecilik olmak başka önemli bir gelişmekte zaman farkında olmalıdır birçok güvenlik sorunları hiç şüphe yoktur.

Sadece bunun için kodlanmış gerektiğini sisteme girer noktada verileri kodlamak - aksi takdirde size gerçek verileri işlemek istediğiniz durumlarda içine çalışacaktır.

SQL enjeksiyon için - Best way to stop SQL Injection in PHP (o hazırlanmış tablolar bahsediyor, ama bu size koruma değil, hazırlık verir bağlayıcıdır) açıklandığı gibi kullanım bağlı değişkenler.

XSS - HTML veya metin belirtilen noktada HTML içine yazıyorsanız. Belgenizi oluşturmak nerede noktada htmlentitiesi kullanın. Ben CPU performansı / disk erişim süreleri olma ve konu edildi bir yazma-nadir-salt çoğunlukla sistemde mümkün dışında (veritabanında bu formda veri depolama önleyeceğini - sonra sütunun bir raw_ ve html_ versiyonu olurdu ... ya da sadece) memcached veya benzeri kullanın.

Kullanıcıların URL'leri girmek icar ise javascript:do_evil() yürütecek geçerli bir URI (örn. bir bağlantı üzerine tıklandığında veya () bazı tarayıcılarda src için bir href olarak olduğu gibi, o zaman, daha dikkatli olmak gerekir Sadece) yüklenir görüntü.

Bu sitede bir göz atın PHP Security Consortium. Ben PHP Güvenlik genel bakış (SQL Injection ve XSS dahil) için iyi bir site olarak bulundu.

Veritabanına veri ekleme veya veritabanı sorgulama ne zaman () htmlentitiesi kullanmak olmaz. Eğer veritabanında veri varlıkları olarak kayıtlı ise, bu veriler html varlıkları anlar şey sonra sadece yararlıdır.

Sen çıkış farklı türleri için, örneğin farklı öncelemeli mekanizmaları kullanmak zorunda SQL - mysql_real_escape_string(), HTML - htmlentities() ya da htmlspecialchars(), kabuk - escapeshellarg(). 'Tehlikeli' olan karakterler, her biri için farklı olmasıdır - Eğer herhangi bir çıkış ortamı için herhangi bir veri güvenli yapabilirsiniz sihirli bir yolu yoktur.