Как мы узнаем, что PDO избегает SQL-инъекций? - PullRequest
5 голосов
/ 07 января 2011

Я новичок в библиотеках PDO. Я работаю в среде разработки с MySQL в качестве базы данных. Я могу выполнить свои запросы, используя функцию подготовки и выполнения, используя "?" заполнитель, а также метод bindParam при использовании именованных заполнителей (например: ": column").

После этого я попытался выяснить, выполняет ли PDO какой-либо вид экранирования, поместив любые кавычки для очистки запроса, как это делает mysql_real_escape_string. Я пытаюсь понять, как будет выглядеть запрос, но все, что я получаю, это оператор, который был передан в оператор prepare, а не запрос, который будет выполнен.

Я пытался var_dump для $ result-> execute () и $ result-> fetch (), но оператор execute дает мне sql моего оператора prepare с заполнителями, а оператор fetch дает мне результат этого запроса. *

Есть ли способ посмотреть на запрос поиска, который будет запущен, или, по крайней мере, как будут выглядеть параметры перед выполнением запроса ??

Надеюсь, у меня возник вопрос с вопросом. : |

Ответы [ 4 ]

6 голосов
/ 07 января 2011

Когда вы пишете что-то вроде:

$stmt = $pdo->prepare('SELECT * FROM tbl_name WHERE col_name = :col_name;');
$stmt->bindValue('col_name', 'some \' value');
$stmt->execute();

Фактический запрос ... SELECT * FROM tbl_name WHERE col_name = :col_name;. Это называется подготовленное заявление . Сначала вы отправляете запрос в базу данных, затем вы отправляете параметры запроса. PDO не объединяет запрос и параметры.

Вы, вероятно, думали, что PDOStatement::bindValue() делает что-то вроде:

public function bindValue($placeholer, $value, $valueType = PDO::PARAM_STR) {
    $this->query = str_replace($placeholder, $this->quote($value, $valueType), $this->query);
}

Но это не .

Он делает что-то еще подобное:

public function execute() {
    try {
        $this->sendQueryToDatabase($this->query);

        // Query is valid
        $this->sendParametersToDatabase($this->parameters);

        return $this->fetchResultSet();
    } catch (... $e) {
        // Query is invalid (eg. syntax error)
        throw ...;
    }
}

Подробнее о подготовленных заявлениях

3 голосов
/ 07 января 2011

Проще говоря.

PDO имеет 2 режима запуска подготовленных операторов:

  1. Родной режим. Запрос и данные отправляются в базу данных se-pa-ra-te-ly . Это означает, что данные никогда не добавляются в запрос. Таким образом, никакого вреда не может быть сделано. Когда-либо. Запрос отправляется в базу данных как есть, с отметками ? (но без именных заполнителей, которые заменяются PDO с ? s)
  2. Режим совместимости. PDO делает запрос в старом стиле, заменяя заполнители связанными переменными в зависимости от имени переменной. Строки цитируются / экранируются, а остальные приводятся к его типу.

Оба метода абсолютно безопасны.

Настоящая опасность начинается, когда у вас есть переменная идентификатор ...

1 голос
/ 07 января 2011

оператор prepare обрабатывается mysql, поэтому pdo не экранирует запрос, pdo отправляет запрос и "after" параметр

0 голосов
/ 07 января 2011

Включите общий журнал запросов и наблюдайте за тем, как на самом деле выполняются запросы к серверу, когда вы выполняете простые операторы - сделайте некоторые вставки, например, со строками, содержащими встроенные кавычки или nuls.

...