Как выглядит и работает фильтрация PHP POST & GET?

Здравствуйте. Использую такую функцию для фильтрации ГЕТ и ПОСТ

function formatstr($str) 
{
        $str = trim($str);
        $str = stripslashes($str);
        $str = htmlspecialchars($str);
        return $str;
};
$login_name=formatstr($_GET['login_name']);


Для тест пробовал загнать $login_name в строку вывода из БД - БД выдает ошибку.
Попробовал вывести через echo $login_name - как были '"<script>и прочий мусор - так и остался.
Как работает эта функция, получается?
Я думал, что будут удаляться все кавычки и теги,а по факту они остаются.
Не использовать же для этого регулярки?
  • Вопрос задан
  • 606 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Как выглядит и работает фильтрация PHP POST & GET?

Никак.
Я понимаю, что это утверждение не укладывается голове у человека, изучавшего пхп по видеокурсам, но это факт.
Сами по себе НТТР запросы POST & GET никакой угрозы не несут и как-то заранее фильтровать их не надо.

Фильтровать вообще надо не по принципу "откуда", а по принципу "куда".
Данные надо форматировать в зависимости от того, куда они пойдут, а не откуда они пришли. SQL запросу абсолтно фиолетово, откуда взялась кавычка в данных - из GET, файла на диске, или из другой базы данных. Данные для SQL надо правильно форматировать не потому что они пришли из GET, а потому что они идут в SQL.
(При этом надо также понимать, что SQL запрос и база данных - это не одно и тоже. Базе тоже по барабану, что в ней лежит. Любое форматирование мы делаем только для SQL запроса, а в базе данные снова должны быть как есть).

Я думал, что будут удаляться все кавычки и теги,а по факту они остаются.

Если бы все думали, как ты, то ты бы не смог задать свой вопрос на Тостере. Потому что без кавычек и тегов он превратился бы в бессмыслицу. Как и куча любых других вопросов.
Разумеется, "мусор" надо не удалять, а форматировать. Потому что это "мусор" только для SQL, а для человека это нужная информация, которая помогает читать текст.

Не использовать же для этого регулярки?

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

Для того, чтобы поместить переменную в SQL запрос, надо использовать подстановки в подготовленных выражениях. Запомни это предложение. Оно важнее всего, что ты до сих пор успел узнать про пхп. Хорошоенько запомни, ты должен это знать лучше, чем зовут маму с папой. И никогда не отступать от этого правила. Не важно - нужна тебе защита от SQL инъекций или не нужна, из POST-а ли пришли данные, или Господь бог тебе их надиктовал на горе Синайской - все равно всегда и везде только через подстановки.

Поэтому.
1. Выкидываешь свою функцию на помойку. Единственное слово, которое там имеет там хоть какой-то смысл - это trim(). Ну так ты можешь вызывать её напрямую.
2. Судя по уровню кода и вопроса, для работы с бд ты используешь убогую mysqli. Поэтому забудь вообще про mysqli_query(), а все запросы, в которых используется хотя бы одна переменная, выполняешь только так
$stmt = $conn->prepare("INSERT INTO tablitsa (login_name,email) VALUES (?,?)");
$stmt->bind_param("ss", $login, $email);
$stmt->execute();

Подробнее можешь почитать в интернете.
3. При выводе пользовательских данных в HTML, используешь функцию htmlspecialchars(). Надеюсь, к этому моменту ты уже понял главную мысль - важно не откуда пришли данные, а куда. Идут в хтмл? Отлично, форматируем их для хтмл.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
inkShio
@inkShio
trim - Эта функция возвращает строку str с удаленными из начала и конца строки пробелами.
stripslashes — Удаляет экранирование символов.
htmlspecialchars — Преобразует специальные символы в HTML-сущности

<?php
function formatstr($str) 
{
    $str = trim($str);
    $str = stripslashes($str);
    $str = htmlspecialchars($str);
    return $str;
};

$login_name = formatstr('test');
print_r($login_name);

$login_name2 = formatstr('<p>test</p>');
print_r($login_name2);

$login_name3 = formatstr('<p class="test">test</p>');
print_r($login_name3);
?>


результат
test

&lt;p&gt;test&lt;/p&gt;

&lt;p class=&quot;test&quot;&gt;test&lt;/p&gt;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы