За последние 24 часа нас посетили 17404 программиста и 1682 робота. Сейчас ищут 956 программистов ...

Безопасность SQL запросов

Тема в разделе "PHP для новичков", создана пользователем xfreewindx, 1 мар 2012.

  1. xfreewindx

    xfreewindx Активный пользователь

    С нами с:
    22 фев 2012
    Сообщения:
    55
    Симпатии:
    0
    Здравствуйте!
    по началу запросы составлял так:
    Код (Text):
    1.  
    2. $f_query = "INSERT INTO `articles` (`title`, `content`)
    3.                   VALUES ('%s', '%s')";
    4. $query = sprintf($f_query, mysql_real_escape_string($title), mysql_real_escape_string($content));
    5. mysql_query($query) or die(mysql_error());
    после перехода на PDO, прочитал что при использовании подготовленных запросов, метод prepare сам проверяет запрос на SQL инъекции. Вопрос нужно ли все-таки в подготовленных запросах использовать mysql_real_escape_string?
    Сейчас написано так:
    Код (Text):
    1.  
    2. $query = "INSERT INTO `articles` (`title`, `content`) VALUES ('$title', '$content')";
    3. $stmt = self::$dbh->prepare($query);
    4. $stmt->execute();
     
  2. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Какой для вас смысл использовать метод prepare если вы им не препарируете? -)

    И да, prepare помогает предотвратить SQL-инъекций, избавляя от необходимости вручную экранировать параметры, но в вашем случае это работать не будет и ваш код подвержен SQL-инъекциям.
     
  3. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    $res = $pdo->prepare("INSERT INTO `table` (`column1`, `column2`) VALUES :)value1, :value2)");
    $res->bindParam(':value1', $var1, PDO::pARAM_STR);
    $res->bindParam(':value2', $var2, PDO::pARAM_INT);
    $res->execute();

    в таком случае mysql_real_escape_string уже не нужен.
     
  4. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Биндить совсем не обязательно, это может сделать самостоятельно execute(), нужно только ему параметры сунуть.
     
  5. xfreewindx

    xfreewindx Активный пользователь

    С нами с:
    22 фев 2012
    Сообщения:
    55
    Симпатии:
    0
    То есть насколько я понял из документации
    если используешь execute() с параметрами, то константы типа PDO::pARAM_* не используются и все будет безопасно с точки зрения SQL-инъекций, также как и при использовании bindparam ?
    Код (Text):
    1.  
    2. <?php
    3. /* Execute a prepared statement by passing an array of insert values */
    4. $calories = 150;
    5. $colour = 'red';
    6. $sth = $dbh->prepare('SELECT name, colour, calories
    7.     FROM fruit
    8.     WHERE calories < :calories AND colour = :colour');
    9. $sth->execute(array(':calories' => $calories, ':colour' => $colour));
    10. ?>