Очень крутая задача, в которой не всё так просто, как кажется на первый взгляд. Попробуйте найти в ней 2 логические ошибки. SQL-инъекция здесь служит отвлекающим манёвром.
<?php
$dest = $_POST['destination'];
$result = $_POST['data']['result'];
$output = "";
if ($dest == 'file') {
$file = fopen('storage.txt', 'a+');
fwrite($file, $result);
$output = "stored in file";
} elseif ($dest == 'db') {
$db = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'user', 'pass');
$db->exec("INSERT INTO storage (value) VALUES ('{$result}');");
$output = "stored in db";
}
echo $output;
Что произойдёт, если по какой-то причине fwrite() не удастся произвести запись в файл? Он вернёт false, а скрипт благополучно выведет на экран stored in file, что введёт пользователя в заблуждение, и может привести всю систему в неконсистентное состояние.
Вторая логическая ошибка аналогичная. Тех, кто мало работал с PDO может шокировать то, что PDO::exec() не бросает исключений в случае ошибок. Да, PDO::__construct() бросает исключение, а PDO::exec() — нет. Однако, он возвращает количество затронутых строк. Т.е. если было вставлено 0 строк, то выводить на экран stored in db будет не корректно.
Дополнительно можно проверять что возвращают PDO::errorCode() и PDO::errorInfo().
Вот так привычка работать с исключениями и отсутствие стандартизации в старых стандартных библиотеках PHP могут сыграть злую шутку с программистом в 2к17 году.