PHP kullanıcı girişleri santize nasıl?

8 Cevap php

Bu yeterli mi?

$listing = mysql_real_escape_string(htmlspecialchars($_POST['listing']));

8 Cevap

Bağlıdır - metin bekliyoruz eğer giriş htmlspecialchars koymak gerekir, ancak bu, gayet güzel. Çıktı bunu.

Bunu okumak isteyebilirsiniz: http://stackoverflow.com/questions/129677/whats-the-best-method-for-sanitizing-user-input-with-php

Eğer php işlevini kullanabilirsiniz: filter_var()

bağlantı iyi bir öğretici:

http://www.phpro.org/tutorials/Filtering-Data-with-PHP.html

tamsayı sterilize etmek için bir örnek:

To sanitize an Integer is simple with the FILTER_SANITIZE_INT filter. This filter strips out all characters except for digits and . + - It is simple to use and we no longer need to boggle our minds with regular expressions.

<?php

/*** an interger ***/
$int = "abc40def+;2";

/*** sanitize the integer ***/
echo filter_var($int, FILTER_SANITIZE_NUMBER_INT);

?>

Filtre tarafından belirtilen Yukarıdaki kod, hiçbiri INT değerler olarak 40 +2 bir çıkış üretir kaldırıldı

Bkz:

Bunun için güvenli hale gereken bağlamında kullanılan önce ve hemen veri sterilize. (HTML çıktı üzeresiniz kadar örneğin böyle) hiç e-posta ile veritabanından içerik göndermeye karar gibi (daha önce düzenlenmemiş veri gerekebilir, htmlspecialchars çalıştırmayın).

Evet. Ancak, giriş üzerinde htmlspecialchars kullanmamalısınız. Sadece çıkışta, bunu yazdırmak zaman.

Bu çıkış daima html yoluyla olacağı belli değil, çünkü bu. Bu bir terminal üzerinden olabilir, bu yüzden garip kodları aniden ortaya eğer kullanıcıları karıştırmayın olabilir.

Bu elde etmek istediğinize bağlıdır. Sizin sürüm prevents (probably) all SQL injections ve HTML şeritler (daha doğrusu: tarayıcıya gönderirken yorumlanır önler). Siz (ve muhtemelen gerekir) çıktı, değil girişi htmlspecialchars() geçerli olabilir. Belki gelecekte bir zaman <b> gibi basit şeyler izin istiyorum.

Ama örneğin, sterilize daha var Bir E-posta Adresi bekliyoruz eğer bu gerçekten bir e-posta adresi olduğunu doğrulamak olabilir.

Girişi htmlspecialchars sadece çıkış kullanmayın olarak söylenmiştir. Dikkate alınması gereken başka bir şey beklendiği gibi girişidir sağlamaktır. Örneğin bir numara kullanım is_numeric () bekliyorsanız veya sadece belirli bir büyüklük ya da bunun için en azından belirli bir boyut kontrolü için bir dize bekliyorsanız eğer. Bu şekilde daha sonra kendi giriş yapmış herhangi bir yanlışlık kullanıcıları uyarabilir.

Ne yönetin değişken bir dizi olur?

Özyinelemeli bu değişkeni sterilize edilmelidir.

Edit:

Aslında, bu teknikle SQL enjeksiyonu önlemek ama XSS kaçınamaz.

In order to sanitize "unreliable" string, i usually combine strip_tags and html_entity_decode. This way, i avoid all code injection, even if characters are encoded in a &#321; way.

$cleaned_string = strip_tags( html_entity_decode( $var, ENT_QUOTES, 'UTF-8' ) );

Ardından, önceki arama işlevleri ve çok boyutlu diziler üzerinden yürüyor tekrarlamalı bir fonksiyon oluşturmak zorunda.

Eğer bir SQL deyimi içine bir değişken kullanmak istediğiniz zaman sonunda, sen DBMS-spesifik (veya PDO'su) kaçan işlevini kullanabilirsiniz.

$var_used_with_mysql = mysql_real_escape_string( $cleaned_string );

Verileri sterilize ek olarak ayrıca bunu doğrulamak gerekir. Eğer bir yaş için sormak sonra sayıları kontrol gibi. Ya da bir e-posta adresi geçerli olduğundan emin yapıyor. Güvenlik yararına yanı sıra aynı zamanda kendi girişi olan sorunlar hakkında kullanıcıları bilgilendirmek edebilirsiniz.

Ben girişi kesinlikle bir numara veya kesinlikle bir e-posta adresi böylece güvenlik ilave bir düzeyde olduğunu eğer bir SQL enjeksiyon yapmak neredeyse imkansız olduğunu varsayalım.