PHP ile GET kullanıcının veri sanitasyon

4 Cevap php

How do you sanitize data in $_GET -variables by PHP?

I sanitize only one variable in GET by strip_tags. I am not sure whether I should sanitize everything or not, because last time in putting data to Postgres, the problem was most easily solved by the use of pg_prepare.

4 Cevap

Nasıl PHP ile $ _GET-değişkenler veri dezenfekte mi?

Sen do not $ _GET verileri sterilize. Bu PHP yaygın bir yaklaşımdır, ancak * tamamen yanlış.

Tüm değişkenleri dizenin başka bir tür onları gömmek noktasına kadar düz metin biçiminde kalmalıdır. Eğer değerler içine gömme olabilir dize, bütün türlerini kapsayacak hiç kimse kaçan biçimi ya da 'sanitization' yoktur.

Eğer SQL sorgusunun içine bir dize gömme eğer Yani, dışarı yolda onu kaçmak gerekiyor:

$sql= "SELECT * FROM accounts WHERE username='".pg_escape_string($_GET['username'])."'";

HTML içine dize tükürme konum Ve eğer, o zaman kaçmak gerekir:

Cannot log in as <?php echo(htmlspecialchars($_GET['username'], ENT_QUOTES)) ?>.

Eğer başında $ _GET dizisinde bu kaçan adımların hem yaptıysak, ne yaptıklarını bilmiyorum insanlar tarafından önerilen:

$_GET['username']= htmlspecialchars(pg_escape_string($_GET['username']));

Sonra kullanıcı adınızla bir '&' vardı, o gizemli veritabanındaki '&' dönüşecek, ve kullanıcı adınız bir kesme işareti olsaydı, bu sayfadaki iki kesme dönüşecekti. Bunu bu karakterler ile bir form var o zaman onlar çok kötü PHP CMSs O \ \ \ \ "New kitap gibi kırık makale başlıkları ile sona neden olan, düzenlenmiş yaparken çift kaçan şeyleri sonuna kadar kolaydır \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 'Reilly ".

Doğal olarak, pg_escape_string veya mysql_real_escape_string hatırlamak, ve bir değişken göndermek her zaman herkesin yazısının başında bir yerde (yanlış) bunu yapmak istiyor neden olan, biraz sıkıcı htmlspecialchars. HTML çıktı için, en az yankı (htmlspecialchars (...)) yapar kısa bir isimde bir fonksiyon tanımlayarak bazı yazarak kaydedebilirsiniz.

SQL için, Parametrelenmiş sorguları kullanarak daha iyidir. Postgres için var pg_query_params. Eğer belirtildiği gibi (ben şahsen onları daha yönetilebilir bulmak olsa) ya da aslında, ifadeleri hazırladı. Her iki şekilde de, daha sonra 'hijyen' veya SQL için kaçan unutabilirsiniz, ancak HTML dahil dize diğer türleri embed eğer hala kaçmak gerekir.

strip_tags () HTML görüntüleme için giriş tedavisinde iyi bir yol değildir. Tarayıcınız ayrıştırıcılar aslında çok daha karmaşık bir etiket düşündüğünüzden daha ne olabilir kendi yorumuyla olduğu gibi geçmişte de, güvenlik sorunları olmuştur. htmlspecialchars () yerine kullanmak için hemen hemen her zaman doğru bir şey, o yüzden eğer birisi türleri daha az-daha işaretiyle aslında alırsınız işaretiyle az daha ve yarım onların metin gizemli kaybolan bulamazsınız değişmez.

(*:. Enjeksiyon sorunları çözmek için genel bir yaklaşım olarak, yine Doğal olarak belirli alanlarda yapıyor değer alanı özgü kontrolleri vardır ve gönderilen değerler tüm kontrol karakterleri kaldırarak gibi yapabilirsiniz yararlı temizleme görevleri vardır Ama bu. Çoğu PHP kodlama sanitasyonuyla ne demek değil.)

Çıktıyı sterilize bahsediyoruz, ben dışarı veri yankılanan zaman bu şekilde size, (htmlspecialchars ya da bir şey) tam çıkmamış formu içinde veritabanındaki içerik bulunuyor, saklanması ve sonra kaçan tavsiye ederim çıktısı için daha fazla seçenek var. Veritabanı içeriğini kaçan / sterilize bir tartışma için this soruya bakın.

Tırnak kaçış, ve genellikle SQL enjeksiyon karşı korumak için, sorgudaki her değişken üzerinde pg_escape_string kullanmak, postgres'in saklama açısından.

Edit:

, Bir veritabanında veri saklamak ve daha sonra almak için benim her zamanki adımlar şunlardır:

  1. Lütfen sorguda kullanılan her gelen $ _GET değişkeni kaçmak için, veritabanı veri kaçan fonksiyonunu (pg_escape_string, mysql_escape_string, vb) diyoruz. Not veritabanında depolanan metin içinde ekstra eğik olmaması bu fonksiyonları yerine addslashes sonuçları kullanarak.

  2. Geri veritabanından veri almak zaman hiçbir ekstra bölü olmalıdır, çünkü sadece, herhangi outputted veri stripslashes kullanmak için hiçbir ihtiyacı htmlspecialchars kullanabilirsiniz.

Sen, GET POST değil sadece tüm istekleri sterilize edilmelidir.

: Sen fonksiyonunu htmlentities(), döküm tarafından işlevi preg_replace () regex veya filtre kullanabilirsiniz

<?
$id = (int)$_GET['id'];
?>

[] 'S

Gidiyor yere göre girişleri sterilize.

  • Eğer (bir sayfada ya da giriş alanın değeri olarak) görüntülemek varsa, htmlspecialchars kullanabilir ve / veya str_replace.
  • Eğer başka bir türü olarak kullanırsanız, döküm.
  • (Kaçmış gibi aynı değildir) SQL sorguda eklerseniz, uygun işlevini kullanarak kaçmak bu tamamen kaldırılmasını istediğiniz takdirde belki html etiketleri şerit.

DB içindeki verileri genellikle kaçtı olmamalı, çünkü POST veya DB bile veriler için aynı.

Eğer kontrol gereken iki şey:

  1. PHP betikleri / çıkış / DB masaya vs sizin giriş Kodlama
  2. Eğer [magic_quotes_gpc][1] etkin varsa (zaman yapabilirsiniz), bunu devre dışı bırakmalısınız ya da stripslashes(), POST ve COOKIE değerleri GET. magic_quotes_gpc önerilmiyor, sen use bu verilerin bağlı olarak, manipüle verileri sterilize edilmelidir.