Funkcja bezpieczeństwa PHP: strip_tags, filter_var, Md5 i sha1

⚡ Inteligentne podsumowanie

PHP Security chroni aplikacje internetowe przed atakami i nieostrożnym wprowadzaniem danych poprzez walidację, oczyszczanie i bezpieczne przechowywanie danych. Ten przewodnik omawia główne zagrożenia, a następnie strip_tags, filter_var i esca.pingoraz nowoczesne hashowanie haseł za pomocą password_hash w celu obrony przed atakami XSS, atakami SQL injection i kradzieżą danych uwierzytelniających.

  • 🛡️ Poznaj zagrożenia: Główne zagrożenia to wstrzykiwanie kodu SQL, wykonywanie skryptów między witrynami i wstrzykiwanie kodu, zwykle dostarczane za pośrednictwem formularzy lub URL parametry.
  • 🧹 Tagi pasków: strip_tags usuwa HTML, JavaSkrypt i znaczniki PHP z danych wejściowych, zmniejszające ryzyko zapisanych skryptów międzywitrynowych.
  • Sprawdź poprawność danych wejściowych: filter_var weryfikuje i oczyszcza dane, potwierdzając, że wartość jest oczekiwanym typem zanim kod zacznie jej ufać.
  • 🔒 Ucieczka lub powiązanie: mysqli_real_escape_string ucieka z danych wejściowych zapytania, ale sparametryzowane przygotowane instrukcje stanowią silniejszą obronę przed atakami SQL.
  • 🔑 Poprawne hashowanie haseł: Nigdy nie przechowuj haseł z algorytmem MD5 lub SHA1; używaj password_hash i password_verify, które stosują powolne, solone hashowanie bcrypt.
  • 💡 Obrona w głębi: Połącz walidację, escaping, HTTPS i kont baz danych o najmniejszych uprawnieniach, zamiast polegać na pojedynczym sterowaniu.
  • 🤖 Asystent AI: Narzędzia AI mogą audytować kod PHP pod kątem luk w zabezpieczeniach i pomagać w bezpiecznym naprawianiu luk w zabezpieczeniach typu SQL injection lub XSS.

Bezpieczeństwo PHP

Potencjalne zagrożenia bezpieczeństwa

Istnieją zasadniczo dwie grupy osób, które mogą zaatakować Twój system:

  • Hakerzy – których celem jest uzyskanie dostępu do nieautoryzowanych danych lub zakłócenie działania aplikacji
  • Użytkownicy – ​​mogą nieświadomie wprowadzić błędne parametry do formularzy, co może mieć negatywny wpływ na witrynę lub aplikację internetową.

Oto rodzaje ataków, na które musimy uważać.

SQL Injection – ten typ ataku polega na dodawaniu szkodliwego kodu SQL sprawozdania.

Można to zrobić za pomocą formularzy wprowadzania danych przez użytkownika lub URLktóre używają zmiennych.

Dołączony kod zakomentowuje warunek w klauzuli WHERE instrukcji SQL. Dołączony kod może również:

  • wstaw warunek, który zawsze będzie prawdziwy
  • usunąć dane z tabeli
  • zaktualizować dane w tabeli

Ten rodzaj ataku jest zwykle stosowany w celu uzyskania nieautoryzowanego dostępu do aplikacji.

Skrypty między witrynami (XSS) – ten typ ataku polega na wstawianiu szkodliwego kodu, zwykle JavaSkrypt. Odbywa się to za pomocą formularzy wprowadzania danych przez użytkownika, takich jak formularze kontaktowe i formularze komentarzy. Ma to na celu:

  • Odzyskaj poufne informacje, takie jak dane cookie
  • Przekieruj użytkownika do innego URL.

Inne zagrożenia mogą obejmować wstrzyknięcie kodu PHP, wstrzyknięcie powłoki, wstrzyknięcie wiadomości e-mail i ujawnienie kodu źródłowego skryptu.

Najlepsze praktyki w zakresie bezpieczeństwa aplikacji PHP

Przyjrzyjmy się teraz niektórym najlepszym praktykom bezpieczeństwa PHP, które musimy wziąć pod uwagę podczas tworzeniaping nasze aplikacje.

Strip_tags PHP

Funkcja strip_tags usuwa kod HTML, JAVASCRIPTlub tagi PHP z ciągu.

Funkcja ta przydaje się, gdy musimy zabezpieczyć naszą aplikację przed atakami takimi jak cross-site scripting.

Rozważmy aplikację, która przyjmuje komentarze od użytkowników.

<?php
 
$user_input = "Your site rocks";
 
echo "<h4>My Commenting System</h4>";
 
echo $user_input;
 
?>

Zakładając, że zapisałeś plik comments.php w folderze phptuts, przejdź do URL http://localhost/phptuts/comments.php

Strip_tags PHP

Załóżmy, że otrzymujesz jako dane wejściowe użytkownika następujące informacje: alert(‘Your site sucks!’);

<?php
 
$user_input = "<script>alert(0);</script>";
 
echo "<h4>My Commenting System</h4>";
 
echo $user_input;
 
?>

Przejdź do URL http://localhost/phptuts/comments.php

Strip_tags PHP

Zabezpieczmy teraz naszą aplikację przed tego typu atakami, korzystając z funkcji strip_tags.

<?php
 
$user_input = "<script>alert(0);</script>";
 
echo strip_tags($user_input);
 
?>

Przejdź do URL http://localhost/phptuts/comments.php

Strip_tags PHP

Funkcja PHP filter_var

Funkcja filter_var służy do sprawdzania poprawności i oczyszczania danych.

Walidacja sprawdza, czy dane są odpowiedniego typu. Sprawdzanie poprawności numerycznej ciągu zwraca fałszywy wynik.

Sanityzacja polega na usuwaniu nielegalnych znaków z pliku ciąg.

Aby zapoznać się z pełną treścią, kliknij ten link: filtr_zmienna

Poniższy kod dotyczy systemu komentarzy. Używa on funkcji filter_var i stałej FILTER_SANITIZE_STRIPPED do usuwania tagów.

<?php
 
$user_input = "<script>alert(0);</script>";
 
echo filter_var($user_input, FILTER_SANITIZE_STRIPPED);
 
?>

Wyjście:

alert('Your site sucks!');

Uwaga: Funkcja FILTER_SANITIZE_STRIPPED (alias funkcji FILTER_SANITIZE_STRING) jest przestarzała od wersji PHP 8.1. W nowym kodzie należy używać funkcji strip_tags() lub, dla bezpiecznego wyświetlania, htmlspecialchars().

PHP mysqli_real_escape_string

Funkcja mysqli_real_escape_string pomaga chronić aplikację przed atakami SQL injection.

Załóżmy, że mamy następujące polecenie SQL w celu sprawdzenia identyfikatora użytkownika i hasła.

<?php
SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass';
?>

Użytkownik złośliwy może wejść 'LUB 1 = 1 — W polu tekstowym identyfikatora użytkownika wpisz 1234, a w polu tekstowym hasła 1234. Zakodujmy moduł uwierzytelniania.

<?php
 
$uid = "0$uid1$pwd';";
 
echo $sql;
 
?>

Efektem końcowym będzie:

SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';

TUTAJ,

  • „WHERE uid = ”” sprawdza, czy identyfikator użytkownika jest pusty
  • „OR 1 = 1” to warunek, który zawsze będzie prawdziwy
  • „–” komentuje część sprawdzającą hasło.

Powyższe zapytanie zwróci wszystkich użytkowników. Użyjmy teraz funkcji mysqli_real_escape_string, aby zabezpieczyć nasz moduł logowania. Zauważ, że w prawdziwym kodzie ta funkcja przyjmuje połączenie z bazą danych jako pierwszy argument.

<?php
 
$uid = mysqli_real_escape_string($conn, "0$uid1$pwd';";
 
echo $sql;
 
?>

Powyższy kod wyświetli:

SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';

Uwaga: drugi pojedynczy cudzysłów został zastąpiony znakiem ucieczki, więc będzie traktowany jako część identyfikatora użytkownika, a hasło nie zostanie zakomentowane.

Najlepsze praktyki: ucieczkaping pomaga, ale sparametryzowane przygotowane instrukcje w MySQL lub PDO stanowią zalecaną obronę przed atakami typu SQL injection, ponieważ dane nigdy nie są mieszane z tekstem zapytania.

PHP Md5 i PHP sha1

MD5 to skrót od Message Digest 5, a SHA1 to skrót od Secure Hash Algorithm 1. Obie te funkcje są jednokierunkowymi funkcjami haszującymi.

Poniższy kod pokazuje implementację md5 i sha1.

<?php
echo "MD5 Hash: " . md5("password");
echo "SHA1 Hash: " . sha1("password");
?>

Zakładając, że zapisałeś plik hashes.php w folderze phptuts, przejdź do URL.

PHP Md5 i PHP sha1

Ważne: MD5 i SHA1 to szybkie, niezasolone skróty, które są nie jest już uważane za bezpieczne do przechowywania haseł, ponieważ można je szybko złamać za pomocą nowoczesnego sprzętu i tablic tęczowych. Używaj ich tylko do sum kontrolnych niezwiązanych z bezpieczeństwem, a do haseł użyj poniższej metody.

Jak bezpiecznie haszować hasła w PHP

Do przechowywania haseł PHP udostępnia funkcje password_hash i password_verify. Stosują one powolny algorytm z solą (domyślnie bcrypt), dzięki czemu każdy hash jest unikalny i trudny do złamania, nawet w przypadku kradzieży bazy danych.

<?php
// Hash a password before storing it in the database
$hash = password_hash("mypassword", PASSWORD_DEFAULT);
 
// Verify the password when the user logs in
if (password_verify("mypassword", $hash)) {
    echo "Password is valid";
} else {
    echo "Invalid password";
}
?>
  • hasło_hash() generuje zasolony hash do zapisania w bazie danych; PASSWORD_DEFAULT utrzymuje bieżący zalecany algorytm.
  • hasło_weryfikuj() sprawdza próbę logowania na podstawie zapisanego skrótu, nie odszyfrowując go.

Ponieważ sól i algorytm są przechowywane w hashu, nigdy nie musisz nimi zarządzać samodzielnie, co sprawia, że ​​jest to prawidłowy i przyszłościowy sposób obsługi haseł w PHP.

FAQ

Używaj przygotowanych instrukcji z powiązanymi parametrami w MySQL lub PDO. Wysyłają one zapytanie i dane oddzielnie, więc dane wprowadzane przez użytkownika nigdy nie mogą zmienić struktury zapytania. To rozwiązanie jest skuteczniejsze niż ręczne esca.ping wkład.

Funkcja strip_tags całkowicie usuwa znaczniki HTML i PHP, natomiast htmlspecialchars konwertuje je na bezpieczne encje, dzięki czemu są wyświetlane jako tekst. W przypadku danych wyjściowych funkcja escaping W przypadku XSS bezpieczniejszym wyborem jest zazwyczaj htmlspecialchars.

Generuj unikalny token CSRF dla każdej sesji, osadzaj go jako ukryte pole w każdym formularzu i weryfikuj po przesłaniu. Odrzucaj każde żądanie, którego token brakuje lub nie pasuje do zapisanej wartości.

Tak. Sztuczna inteligencja może skanować pod kątem ataków SQL injection, XSS, niebezpiecznego hashowania haseł i niebezpiecznego przetwarzania plików, a następnie wyjaśniać każde ryzyko i proponować rozwiązanie. Traktuj to jako pomocne pierwsze podejście, a nie jako substytut przeglądu bezpieczeństwa.

Tak. Wklej podatny kod, a AI przepisze go za pomocą przygotowanych poleceń i wygeneruje esca.pingi walidację danych wejściowych. Przetestuj poprawiony kod i potwierdź poprawkę na podstawie oryginalnych danych wejściowych ataku.

Podsumuj ten post następująco: