Учебное пособие: Работа с базой данных MySQL средствами PHP

}

for ($i=$c=count($args)-1; $i<$c+20; $i++)

$args[$i+1] = "UNKNOWN_PLACEHOLDER_$i";

return call_user_func_array("sprintf", $args);

}

?>


Функция sprintf() воспринимает символ % как управляющий. Чтобы отменить его специальное действие, необходимо его удвоить, что и делается в функции. Затем ? заменяется на %s, для sprintf() это означает "взять очередной строковый аргумент".

Для удобства тестирования этого кода главная функция разбита на две, выделен код замены подстановочных знаков в функцию mysql_make_qw().

В листинге test_qw.php приведен пример того, как будут выглядеть SQL-запросы после подстановки placeholders.

Листинг test_qw.php

<?php

require_once "lib_mysql_qw.php";

require_once "mysql_connect.php";

// Представим, что мы - хакеры...

$name = "' OR '1";

// Допустимый запрос.

echo mysql_make_qw('DELETE FROM people WHERE name=?', $name)."<br>";

// Недопустимый запрос.

echo mysql_make_qw('DELETE FROM people WHERE name=? OR ?', $name)."<br>";

// Вот как выглядит выполнение запроса.

mysql_qw('DELETE FROM people WHERE name=? OR ?', $name)

or die(mysql_error());

?>

В результате работы скрипта будет сгенерирована следующая страница:

DELETE FROM people WHERE name='\' OR \'1'

DELETE FROM people WHERE name=' \ ' OR \ ' 1' OR id=UNKNOWN_PLACEHOLDER_l

Unknown column 'UNKNOWN_PLACEHOLDER_1' in 'where clause1


К-во Просмотров: 1125
Бесплатно скачать Учебное пособие: Работа с базой данных MySQL средствами PHP