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

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

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

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

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

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

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

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

Никакие.

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

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

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

При выводе в каком-либо другом контексте, например в тело кода яваскрипт, правила будут другие.
Ответ написан
Пригласить эксперта
Ответы на вопрос 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();
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 16:53
1000 руб./за проект
19 апр. 2024, в 16:45
5000 руб./за проект
19 апр. 2024, в 16:22
30000 руб./за проект