PHP функция за сигурност: strip_tags, filter_var, Md5 и sha1
⚡ Умно обобщение
PHP Security защитава уеб приложенията от атакуващи и небрежно въвеждане на данни, като валидира, дезинфекцира и безопасно съхранява данни. Това ръководство обхваща основните заплахи, след което показва strip_tags, filter_var, escapingи модерно хеширане на пароли с password_hash за защита срещу XSS, SQL инжекции и откраднати идентификационни данни.

Потенциални заплахи за сигурността
Има основно две групи хора, които могат да атакуват вашата система:
- Хакери – с намерение да получат достъп до неоторизирани данни или да нарушат приложението
- Потребители – те могат неволно да въведат грешни параметри във формуляри, което може да има отрицателни последици за уебсайт или уеб приложение.
По-долу са видовете атаки, за които трябва да внимаваме.
SQL Injection – този тип атака добавя вреден код към SQL изявления.
Това се прави или с помощта на формуляри за въвеждане от потребителя, или URLкоито използват променливи.
Добавеният код коментира условието в клаузата WHERE на SQL оператор. Добавеният код може също:
- въведете условие, което винаги ще бъде вярно
- изтриване на данни от таблица
- актуализирайте данните в таблица
Този тип атака обикновено се използва за получаване на неоторизиран достъп до приложение.
Междусайтово скриптиране (XSS) – този тип атака вмъква вреден код, обикновено JavaСкрипт. Това се прави с помощта на формуляри за въвеждане на данни от потребителя, като например формуляри за контакт и формуляри за коментари. Това се прави, за да:
- Извличане на чувствителна информация, като напр данни за бисквитки
- Пренасочете потребителя към друг URL.
Други заплахи могат да включват инжектиране на PHP код, инжектиране на shell, инжектиране на имейл и разкриване на изходния код на скрипт.
Най-добри практики за сигурност на PHP приложения
Нека сега разгледаме някои от най-добрите практики за сигурност на PHP, които трябва да вземем предвид при разработванетоping нашите приложения.
PHP strip_tags
Функцията strip_tags премахва HTML, JavaСценарийили PHP тагове от низ.
Тази функция е полезна, когато трябва да защитим приложението си от атаки, като например междусайтово скриптиране.
Нека разгледаме приложение, което приема коментари от потребители.
<?php $user_input = "Your site rocks"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
Ако сте запазили comments.php в папката phptuts, отидете до URL http://localhost/phptuts/comments.php
Да предположим, че получавате следното като потребителски вход: alert(‘Your site sucks!’);
<?php $user_input = "<script>alert(0);</script>"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
Прегледайте URL http://localhost/phptuts/comments.php
Нека сега защитим приложението си от подобни атаки, използвайки функцията strip_tags.
<?php $user_input = "<script>alert(0);</script>"; echo strip_tags($user_input); ?>
Прегледайте URL http://localhost/phptuts/comments.php
Функция PHP filter_var
Функцията filter_var се използва за валидиране и дезинфекция на данни.
Валидирането проверява дали данните са от правилния тип. Числовата проверка за валидиране на низ връща грешен резултат.
Санирането е премахване на незаконни знаци от a низ.
Проверете тази връзка за пълната справка: filter_var
Кодът по-долу е за системата за коментиране. Той използва функцията filter_var и константата FILTER_SANITIZE_STRIPPED за премахване на тагове.
<?php $user_input = "<script>alert(0);</script>"; echo filter_var($user_input, FILTER_SANITIZE_STRIPPED); ?>
Изход:
alert('Your site sucks!');
Забележка: FILTER_SANITIZE_STRIPPED (псевдоним на FILTER_SANITIZE_STRING) е остарял от PHP 8.1. За нов код използвайте strip_tags() или, за безопасно показване, htmlspecialchars().
PHP mysqli_real_escape_string
Функцията mysqli_real_escape_string се използва за защита на приложението от SQL инжектиране.
Нека предположим, че имаме следния SQL израз за валидиране на потребителското име и паролата.
<?php SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass'; ?>
Злонамерен потребител може да влезе ' ИЛИ 1 = 1 — в текстовото поле за потребителски идентификатор и 1234 в текстовото поле за парола. Нека кодираме модула за удостоверяване.
<?php $uid = "0$uid1$pwd';"; echo $sql; ?>
Крайният резултат ще бъде:
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
ТУК,
- „WHERE uid = ”“ проверява за празен потребителски идентификатор
- „ИЛИ 1 = 1“ е условие, което винаги ще бъде вярно
- „–“ коментира частта, която проверява паролата.
Горната заявка ще върне всички потребители. Нека сега използваме функцията mysqli_real_escape_string, за да защитим нашия модул за вход. Обърнете внимание, че в реалния код тази функция приема връзката с базата данни като свой първи аргумент.
<?php $uid = mysqli_real_escape_string($conn, "0$uid1$pwd';"; echo $sql; ?>
Горният код ще изведе:
SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';
Забележка: втората единична кавичка е екранирана, така че ще бъде третирана като част от потребителското име, а паролата няма да бъде коментирана.
Най-добри практики: ескаping помага, но параметризираните подготвени оператори в mysqli или PDO са препоръчителната защита срещу SQL инжектиране, защото данните никога не се смесват с текста на заявката.
PHP Md5 и PHP sha1
MD5 е акронимът за Message Digest 5, а SHA1 е акронимът за Secure Hash Algorithm 1. И двете са еднопосочни хеширащи функции.
Кодът по-долу показва имплементацията на md5 и sha1.
<?php echo "MD5 Hash: " . md5("password"); echo "SHA1 Hash: " . sha1("password"); ?>
Ако сте запазили файла hashes.php в папката phptuts, отидете до URL.
Важно: MD5 и SHA1 са бързи, несолени хешове и са вече не се счита за безопасно място за съхранение на пароли, защото могат да бъдат бързо разбити със съвременен хардуер и таблици тип „rainbow“. Използвайте ги само за контролни суми, които не са свързани със сигурността, и използвайте метода по-долу за пароли.
Как сигурно да хеширате пароли в PHP
За съхранение на пароли, PHP предоставя password_hash и password_verify. Те прилагат бавен, „солен“ алгоритъм (bcrypt по подразбиране), така че всеки хеш е уникален и скъп за разбиване, дори ако базата ви данни бъде открадната.
<?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"; } ?>
- password_hash() генерира осолен хеш, който да се съхранява в базата данни; PASSWORD_DEFAULT ви държи на текущия препоръчителен алгоритъм.
- проверка_на_парола() проверява опит за влизане спрямо съхранения хеш, без изобщо да го декриптира.
Тъй като солта и алгоритъмът се съхраняват в хеша, вие никога не ги управлявате сами, което прави това правилният и устойчив на промени начин за работа с пароли в PHP.




