Cieszę swoje wysiłki. Musisz, przyjazny członek społeczności, rozważ rozłączenie swoich operacji.
) Czy jedna funkcja/rutynowe/klasy/metody filtrowania wejście (filter_input_array()
, strip_tags()
, str_ireplace()
, trim()
, etc ...). Możesz tworzyć funkcje, które używają pętli do filtrowania. Sztuczki takie jak podwójne kodowanie, jednorazowe fałszowanie i inne mogą pokonać pojedyncze użycie takich rzeczy, jak strip_tags()
.
Oto metoda otoki strip_tags()
z mojej klasy Sanitizer
. Zwróć uwagę, jak porównuje starą wartość z nową wartością, aby sprawdzić, czy są one równe. Jeśli nie są równe, nadal używają strip_tags()
. Mimo, że przed wykonaniem tej metody jest całkiem sporo wstępnego sprawdzenia INPUT_POST/$ _POST. Inna wersja tego przy użyciu trim()
jest faktycznie wykonywana przed tym.
private function removeHtml(&$value)
{
if (is_scalar($value)) {
do {
$old = $value;
$value = strip_tags($value);
if ($value === $old) {
break;
}
} while(1);
} else if (is_array($value) && !empty($value)) {
foreach ($value as $field => &$string) {
do {
$old = $string;
$string = strip_tags($string);
if ($string === $old) {
break;
}
} while (1);
}
} else {
throw new Exception('The data being HTML sanitized is neither scalar nor in an array.');
}
return;
}
) Mają jeszcze jeden walidacji wejścia (filter_var_array()
, preg_match()
, mb_strlen
, etc ...)
Wtedy, gdy dane muszą przełączać konteksty ...
A) W przypadku baz danych należy użyć przygotowanych instrukcji (najlepiej: PDO
).
B) W przypadku zwrotu/nadawania wejście użytkownika do przeglądarki, ucieczka wyjście z htmlentities()
lub htmlspecialchars
odpowiednio.
Pod względem magicznych cytatów najlepszym rozwiązaniem jest po prostu wyłączyć to w php.ini
.
Teraz, z tymi różnymi konstrukcjami mającymi własne obszary odpowiedzialności, wszystko, co musisz zrobić, to zarządzać przepływem logiki i danych w pliku obsługi. Obejmuje to dostarczanie użytkownikowi komunikatów o błędach (w razie potrzeby) oraz obsługę błędów/wyjątków.
Nie ma potrzeby natychmiastowego korzystania z htmlentities()
lub htmlspecialchars
, jeśli dane przechodzą z formularza HTML bezpośrednio do bazy danych. Punktem ucieczki danych jest zapobieganie interpretowaniu go jako instrukcji wykonywalnych w nowym kontekście. Nie ma niebezpieczeństwa, które można rozwiązać podczas przesyłania danych do silnika zapytań SQL (dlatego filtrujesz i sprawdzasz poprawność danych wejściowych i używasz (PDO
) przygotowanych instrukcji).
Jednak po danych są pobierane z tabel bazy danych i jest bezpośrednio przeznaczone dla przeglądarki, ok, teraz używać htmlentities()
lub htmlspecialchars
. Utwórz function
, który używa pętli for
lub foreach
do obsługi tego scenariusza.
Oto urywek z mojego Escaper
klasy
public function superHtmlSpecialChars($html)
{
return htmlspecialchars($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
}
public function superHtmlEntities(&$html)
{
$html = htmlentities($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
}
public function htmlSpecialCharsArray(array &$html)
{
foreach ($html as &$value) {
$value = $this->superHtmlSpecialChars($value);
}
unset($value);
}
public function htmlEntitiesArray(array &$html)
{
foreach ($html as &$value) {
$this->superHtmlEntities($value);
}
unset($value);
}
Będziesz musiał dostosować swój kod do własnych upodobań i sytuacji.
Uwaga, jeśli planujesz przetwarzanie danych przed wysłaniem ich do przeglądarki, najpierw wykonaj przetwarzanie, a następnie uciec z wygodną funkcją zapętlenia htmlentities()
lub htmlspecialchars
.
Możesz to zrobić!
Korzystanie sporządzanych sprawozdań jest wystarczająco bezpieczne i nie wymagają do ucieczki dane w jakikolwiek sposób. Uciekanie jest konieczne tylko wtedy, gdy łączysz zapytania SQL z danymi wejściowymi, co nie ma miejsca w przypadku korzystania z Przygotowanych instrukcji. –
DBMS automatycznie dezynfekuje parametry zawarte w przygotowanej instrukcji na podstawie oczekiwanego typu danych i kodowania. Jeśli ręcznie wychodzisz z łańcucha, a następnie wysyłasz go jako gotowy parametr instrukcji, w rzeczywistości zmniejszasz jego bezpieczeństwo. – apokryfos
Jeśli masz czas, naucz się używać 'PDO' do obsługi interakcji z bazą danych. http://php.net/manual/en/book.pdo.php –