Что не так с этим скриптом?

Очень крутая задача, в которой не всё так просто, как кажется на первый взгляд. Попробуйте найти в ней 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 году.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *