PHP функция за сигурност: strip_tags, filter_var, Md5 и sha1

⚡ Умно обобщение

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

  • ️ Познайте заплахите: Основните рискове са SQL инжектиране, междусайтово скриптиране и инжектиране на код, обикновено предоставяни чрез формуляри или URL параметри.
  • 🧹 Етикети за стриптийз: strip_tags премахва HTML, JavaСкриптове и PHP тагове от входните данни, намалявайки риска от съхранени междусайтови скриптове.
  • ✅ Валидиране на входните данни: filter_var валидира и дезинфекцира данните, като потвърждава, че дадена стойност е от очаквания тип, преди кодът ви да ѝ се довери.
  • 🔒 Бягство или обвързване: mysqli_real_escape_string екранира входните данни от заявката, но параметризираните подготвени оператори са по-силната защита срещу SQL инжектиране.
  • 🔑 Хеширане на пароли вдясно: Никога не съхранявайте пароли с MD5 или SHA1; използвайте password_hash и password_verify, които прилагат бавно, „солено“ bcrypt хеширане.
  • 💡 Защита в дълбочина: Комбинирайте валидиране, бягствоping, HTTPS и акаунти в базата данни с най-ниски привилегии, вместо да се разчита на един-единствен контрол.
  • 🤖 AI Assist: Инструментите с изкуствен интелект могат да одитират PHP кода за пропуски в сигурността и да помогнат за безопасното отстраняване на SQL инжекции или XSS слабости.

PHP сигурност

Потенциални заплахи за сигурността

Има основно две групи хора, които могат да атакуват вашата система:

  • Хакери – с намерение да получат достъп до неоторизирани данни или да нарушат приложението
  • Потребители – те могат неволно да въведат грешни параметри във формуляри, което може да има отрицателни последици за уебсайт или уеб приложение.

По-долу са видовете атаки, за които трябва да внимаваме.

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

PHP strip_tags

Да предположим, че получавате следното като потребителски вход: 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

PHP strip_tags

Нека сега защитим приложението си от подобни атаки, използвайки функцията strip_tags.

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

Прегледайте URL http://localhost/phptuts/comments.php

PHP strip_tags

Функция 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.

PHP Md5 и PHP sha1

Важно: 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.

Въпроси и Отговори

Използвайте подготвени оператори с обвързани параметри в mysqli или PDO. Те изпращат заявката и данните отделно, така че потребителският вход никога не може да промени структурата на заявката. Това е по-силно от ръчното изключване (esca).ping вход.

strip_tags премахва изцяло HTML и PHP таговете, докато htmlspecialchars ги преобразува в безопасни обекти, така че да се показват като текст. За изход escaping Срещу XSS, htmlspecialchars обикновено е по-безопасният избор.

Генерирайте уникален CSRF токен за всяка сесия, вграждайте го като скрито поле във всеки формуляр и го проверявайте при изпращане. Отхвърляйте всяка заявка, чийто токен липсва или не съответства на съхранената стойност.

Да. Изкуственият интелект може да сканира за SQL инжекции, XSS, несигурно хеширане на пароли и опасна обработка на файлове, след което да обясни всеки риск и да предложи решение. Приемайте го като полезен първи пропуск, а не като заместител на проверка за сигурност.

Да. Поставете уязвимия код и изкуственият интелект може да го пренапише с подготвени оператори, изведете esc.pingи валидиране на входните данни. Тествайте коригирания код и потвърдете корекцията спрямо оригиналните входни данни от атаката.

Обобщете тази публикация с: