PHP'nin yeni input_filter $ _GET okumak veya $ _POST dizileri değil

5 Cevap php

PHP 5.2 orada "input_filter" denilen eklenen güzel bir güvenlik fonksiyonu olduğunu, bu yüzden yerine söyleyerek:

$name = $_GET['name'];

Eğer şimdi söyleyebilirim:

$name = filter_input (INPUT_GET, 'name', FILTER_SANITIZE_STRING);

ve otomatik olarak dize sanitizes da var:

  • FILTER_SANITIZE_ENCODED
  • FILTER_SANITIZE_NUMBER_INT
  • FILTER_SANITIZE_EMAIL
  • FILTER_SANITIZE_URL

etc. so this is a very convenient security feature to use and I want to switch over to it completely.

The problem is... Ben sık sık bu gibi onları işlemeden önce $ _GET ve $ _POST dizileri, manipüle:

$ _GET ['Name'] = '(varsayılan adı)';

ama bu tür int olan "INPUT_GET" okur beri (?) filter_input $ _GET değişikliklere erişimi yok gibi görünüyor. Ben yerine $ _GET okumak için filter_input alabilir eğer güzel olurdu ama:

$name = filter_input ( $_GET, 'name', FILTER_SANITIZE_STRING );

bana hata veriyor:

Warning: filter_input() expects parameter 1 to be long, array given.

Herkes elimden bir şekilde düşünebilirsiniz:

  • filter_input onları okuyabilir önce ben onun değerlerini değiştirmek, böylece INPUT_GET (o whereever) kaynağını işlemek
  • filter_input okumak için olsun $_GET

ADDENDUM:


Zengin sordu: "Neden kesinlikle onları oldukça programlı ekledikten bir şey daha, bir giriş olmak istiyorum, zaten diziler değişiyor."

Bu gelen preprocess değişkenlere sadece çok uygun bir yer, örneğin bir sırayla için:

  • varsayılan ayarlayın ($ _GET ['devlet'] ='' ardından $ _GET ['devlet'] = 'AL')
  • manuel işlem yapmak (vb tüm boşlukları silin)
  • güvenlik (bazıları artık filter_input tarafından yapılacaktır)

Sonra ben gelen değişkeni almak zaman biliyorum, güvenli ve geçerlidir. Tabii ki dizi başka bir dizi ve süreç $ _GET dizisini kopya olabilir ama zaten var, bu sistem diziler ile yapmak mantıklı yüzden $ _GET zaten işleyen bir dizi olduğu için bu sadece gereksiz bir adımdır.

5 Cevap

Elle filter_var ve filter_var_array ile tekrar dizileri okumak için zorlamak olabilir

$name = filter_var ( $_GET['name'], FILTER_SANITIZE_STRING );

Elle dizi değiştiriyorsanız, kesinlikle yine de sanatise gerekmez? Neden yerine programlı ekledikten şey daha, elbette bunları bir giriş olmak istiyorum, zaten diziler değişiyor.

Belki daha kodu / bağlam yararlı olacaktır.

INPUT_GET bit o $ _GET den değerini almak gerekiyor PHP söylüyorum sadece identfier (sayı).

Eğer tüm dizi filter_input kullanmak istiyorsanız, filter_input her dizi anahtarı göndermek ve geri $ _GET içinde sonuç koy, bunun döngü gerekir.

Muhtemelen sadece kendiniz sterilize gelmez bir işlevi yazmak, ve bu da size diziler diziler ile başa çıkmak için izin gerektiği gibi kolay olacak (ne yapacağız o filter_input gibi görünmüyor). "Sihirli tırnak" kaldırma gibi şeyler yapıyor PHP.net belgeleri açıklamalar bu örnek fonksiyonların bir çift vardır. here bir örnek için bkz.

Küresel diziyi değiştirmeden bunu yapmak için kullanışlı bir yol:

if (!($name = filter_input(INPUT_GET, 'name'))) {
    $name = 'default_value';
}

Veya üçlü operatörünü kullanarak:

$name = ($name = filter_input(INPUT_GET, 'name')) ? $name : 'default_value';

Olarak Jrngs tarafından önerildi:

Skip programatically modifying the superglobal request variable and define and use new ordinary variables.

Erişebilir ve (dize indeksleri ile array) ilişkisel dizi değerini değiştirmek için daha yeni bir değişken oluşturmak için hızlı şekilde değil sadece, genellikle de bir yolu daha iyi bir uygulamadır.

filter_input fonksiyonunun bütün mesele hepsi PHP ve güvenlik açıklarının en sık nedeni tek ve en tehlikeli nokta olduğundan sonuçta olarak (XSS ve SQL enjeksiyon her ikisi için), superglobal değişkenlerin kullanımını kaldırmak için de özellikle büyük projelerde hatalar ve karışıklık gibi.

For example, the $_GET and $_REQUEST variables should return the same value for the same key, however:

.../?var=1
var_dump($_GET['var']); ---> string '1' (length=1)
var_dump($_REQUEST['var']); ---> string '1' (length=1)
$_GET['var'] = 2;
var_dump($_GET['var']); ---> int 2
var_dump($_REQUEST['var']; ---> string '1' (length=1)

Not to mention superglobal variables barely make any sense in object oriented code.

Bu nedenle filter_input fonksiyon erişim $ _GET / $ _POST / $ _REQUEST süper küresel değişkenler, bu tamamen bu işlevin noktasını yenilgi olacaktır gerekir. Ve kesinlikle SHOULD NOT Bunun için önerilen filter_var işlevini kullanın:

filter_var($_GET['var'],FILTER_SANITIZE_STRING); ---> JUST NO!

filter_var function değil "hack" bu tür yanı olmayan istek değişkenleri için filtreleme / hijyen işlevsellik sağlamak amacıyla kuruldu. Ne yapıyoruz aslında, başlangıçta istek verilerine daha iyi ve daha güvenli erişimi sağlamak için oluşturuldu filter_input fonksiyonu, filtrelerini almak erişim isteği verileri, tamamen çok yol {[(1 işlevini kendisi bypass olduğunu )]} istek verilere filter_input tarafından sağlanan filtreleri değiştirmek ve uygulamak için oluşturuldu. Ve bu sadece düz yanlış. :)