Fredo14
@Fredo14
школьница

Правильно ли написан код экранирования(?) строки и как он вообще должен работать?

Разбираю чужой код, отправка сообщений в чат:
$saying=htmlspecialchars(strip_tags(stripslashes(mysql_escape_string(strip_tags($_POST['saying'])))));

Впоследствии эта строка должна добавиться в БД, оттуда в исходном виде вывестись на страничку и ничего в процессе не сломать.
Я в этом не очень понимаю, но вроде повторение strip_tags два раза смысла не имеет, а еще в этом чате часть символов (как минимум кавычки) приходится вручную экранировать, чтобы сообщение с ними вообще отправилось. Как работает написанный код и какие функции в нем на самом деле должны быть?
  • Вопрос задан
  • 166 просмотров
Решения вопроса 2
@FanatPHP
Это называется "карго-культ код".

После второй мировой войны ученые вдруг заметили, что папуасы начали строить целые аэродромы из травы и палок. С самолётами, заправщиками и диспетчерскими службами. И заинтересовались этим феноменом.

Оказалось, что во время войны на острове папуасов был аэродром. И с неба прилетали такие штуки, которые привозили кучу ништяков, в основном пожрать. Потом война кончилась, военные ушли, и ништяков не стало.
Огорченные местные решили все взять в свои руки. И настроили самолётов из помета и палок. И сидят, ждут с тех пор ништяков.
Это называется "карго культ".

Приведенный тобой код - это такой же самолёт из сена, написан папуасом.
Он видел где-то несколько функций, но не понимает их смысла. И лепит из них травяной самолёт. Который не летает.
К примеру, любой человек, который понимает пхп хотя бы на базовом уровне (я знаю, таких мало, но они есть), легко приведет пример кода, который все равно пропустит sql-injection даже после всех этих шаманских заклинаний.
Потому что к защите они не имеют никакого отношения.

какие функции в нем на самом деле должны быть?

Никакие.

Любое "экранирование" должно применяться в зависимости от контекста.

Для защиты от sql-injection вообще никак не надо экранировать, а применять подготовленные выражения.

При выводе в HTML надо применять htmlspecialchars. Но только при выводе. А не перед записью в базу данных.

При выводе в каком-либо другом контексте, например в тело кода яваскрипт, правила будут другие.
Ответ написан
l3ftoverz
@l3ftoverz Куратор тега PHP
Туды сюды
Пошли по-порядку:

1. htmlspecialchars — реплейсит опасные HTML символы в безопасные сущности.
2. strip_tags — Удаляет теги HTML и PHP из строки. (Вообще, так делать не нужно, зачем?)
3. stripslashes — Удаляет экранирование символов. Тоже фиг значет зачем, только для того, что бы проблему юзерам и себе создать.
4. mysql_escape_string — ну тут смысл есть, защищает от SQL инъекции, путём экранировани строки.
5. strip_tags — тоже самое, что и в первый раз, зачем? — Одному Богу известно, смысла это делать нет.

Вообще, ничего из этого, кроме как mysql_escape_string делать при записи в БД не нужно. При выводе хватит htmlspecialchars. Тот кто это писал... Ну возможно он не знал что писал?

Для "алёшек" в комментариях: здесь нет совета использовать mysql_escape_string, не нужно мне рассказывать, что это Deprecated, что дрявая и в языке её давно нет. Про подготовленные запросы мне тоже говорить не нужно.
Я ответил сугубо по вопросу в контексте того, как написан существующий код.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
php666
@php666
PHP-макака
Этот код нужно удалить, тут написана ахинея, нужно все переписать с умом и пониманием, как делать. Но сначала надо разобраться. Вот хороший материал - phpfaq.ru/mysql/slashes
Ответ написан
anton_reut
@anton_reut
Начинающий веб-разработчик
Я обычно использую встроенную "защиту" PDO, обработка всяких GET и POST выглядит так:

$sql = 'INSERT INTO items SET
	        name = :name,
	        description = :description,
	        price = :price,
	        date = NOW(),
	        category_id = :category_id,
	        address = :address,
	        image = :image,
	        user_id = :user_id';
	    $s = $pdo->prepare($sql);
	    $s->bindValue(':name', $_POST['name']);
	    $s->bindValue(':description', $_POST['description']);
	    $s->bindValue(':price', $_POST['price']);
	    $s->bindValue(':address', $_POST['address']);
	    $s->bindValue(':category_id', $_POST['category_id']);
	    $s->bindValue(':image', $_FILES['image']['name']);
	    $s->bindValue(':user_id', $_SESSION['id']);
	    $s->execute();
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
21 авг. 2019, в 00:43
500 руб./за проект
21 авг. 2019, в 00:14
1000 руб./за проект