może po prostu array_map
strip_tags
do $_POST
, ale jest o wiele ładniejszy napisać funkcję niestandardową do uzyskania z niego dane:
function post_data($name) {
global $post_cache;
if (in_array($name, $post_cache)) {
return $post_cache[$name];
}
$val = $_POST[$name];
if (is_string($val)) {
$val = strip_tags($val);
} else if (is_array($val)) {
$val = array_map('strip_tags', $val);
}
$post_cache[$name] = $val;
return $val;
}
Spowoduje to, że kod jest bardziej czytelny (inni patrząc na nią na ogół zakładamy że $_POST['foo']
to dane w polu formularza , a nie coś, co już zostało wstępnie przetworzone), nie spowoduje problemów z wtyczkami lub bibliotekami, które próbują uzyskać bezpośredni dostęp do $ _POST, ułatwia dodanie większej logiki do wstępnego przetwarzania $_POST
(unescape, gdy magic quotes są włączone) bez polowania na całe miejsce s w kodzie, w którym korzystasz z danych POST, i oszczędzasz sobie ogromnych bólów głowy, gdy zdasz sobie sprawę, że istnieje kilka pól POST, w których potrzebujesz znaczników HTML. Ogólnie rzecz biorąc, jest naprawdę złym pomysłem bezpośrednia zmiana dowolnego z superglobałów.
Lepiej jest również odkażać dane na wyjściu, a nie na wejściu. Różne zastosowania wymagają różnych metod, na przykład, jeśli używasz
<div class="user_photo">
<img src="<?php echo photo_path($user_id) ?>" alt="<?php echo $user_name ?>" />
</div>
następnie $user_name
jest ataku XSS i strip_tags
nie pomaga przeciwko niej w ogóle; potrzebujesz htmlspecialchars. Jeśli dane użytkownika są używane jako adresy URL, potrzebna jest jeszcze jedna metoda ochrony przed adresami URL javascript:
i tak dalej.
Awesome.Właśnie tego szukałem. –
To nie zabezpieczy się przed XSS, gdy istnieją pola formularza, które mają nazwy takie jak 'foo [bar]' lub 'foo []', które PHP automatycznie konwertuje na tablice. – Tgr
@Tgr: tak, to absolutnie nie powiedzie się tak jak powiedziałeś, ale myślę, że wpadł na pomysł, aby dostosować go do tego, czego potrzebuje – w00d