1

Тема: Захист від SQL-injection PDO

Привіт. Хочу реалізувати захист від SQL-injection методом підготовлених запитів (PDO).

    $db = new PDO("mysql:host=$host;dbname=$nameBd", $loginBd, $passwordBd);
    $today = date("Y-m-d H:i:s");

    $sql = $db->("INSERT INTO `mf_request_list` (`status_id`,`date`,`user_id`,`type`,`email`) VALUES ('0',:today,'0','quest',:email)");
    $data = array( 'today' => "$today", 'email' => "$_POST['quest_email']");  
    $sql->execute($data);

в результаті синтаксична помилка в цьому рядку:

$sql = $db->("INSERT INTO `mf_request_list` (`status_id`,`date`,`user_id`,`type`,`email`) VALUES ('0',:today,'0','quest',:email)");

2

Re: Захист від SQL-injection PDO

Пробував ще так:

    $db = new PDO("mysql:host=$host;dbname=$nameBd", $loginBd, $passwordBd);
    
    $today = date("Y-m-d H:i:s");

    
    $stmt = $db->prepare("INSERT INTO mf_request_list (`status_id`,`date`,`user_id`,`type`,`email`) VALUES (?, ?, ?, ?, ?)");
    $stmt->bindParam(1, '0');
    $stmt->bindParam(2, $today);
    $stmt->bindParam(3, '0');
    $stmt->bindParam(4, 'quest');
    $stmt->bindParam(5, $_POST['quest_email']);

    $stmt->execute();

Помилка в цьому рядку:

    $stmt->bindParam(1, '0');

Fatal error: Cannot pass parameter 2 by reference in D:\wamp64\www\parts.mikro-f.com.ua\form\sendData.php on line 20

3 Востаннє редагувалося Kasper (18.05.2017 11:53:37)

Re: Захист від SQL-injection PDO

прочитав що потрібно вказувати дані які записуються через змінні, а не через константи, помилки не вибиває, але і не записує(

    $varNull = 0;
    $varQuest = "quest";
    $stmt->bindParam(1, $vaeNull);
    $stmt->bindParam(2, $today);
    $stmt->bindParam(3, $vaeNull);
    $stmt->bindParam(4, $varQuest);
    $stmt->bindParam(5, $_POST['quest_email']);

4

Re: Захист від SQL-injection PDO

встановив параметр:

    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

тепер висвічується помилка:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'status_id' cannot be null' in D:\wamp64\www\parts.mikro-f.com.ua\form\sendData.php on line 35

    $stmt->execute();

5

Re: Захист від SQL-injection PDO

Зробив так:

    $stmt = $db->prepare("INSERT INTO `mf_request_list` (status_id, date, user_id, type, email) VALUES (:status_id,:date,:user_id,:type,:email)");
    $varNull = 0;
    $varQuest = "quest";
    
    $params = array( 'status_id' => $varNull, 'date' => $today, 'user_id' => $varNull, 'type' => $varQuest, 'email' => $_POST['quest_email']);  
    $stmt->execute($params);

Все працює)))))

Подякували: 221VOLT, ostap34PHP2

6 Востаннє редагувалося ostap34PHP (04.06.2017 11:47:35)

Re: Захист від SQL-injection PDO

невеличка функція для mysql(mysqli)...

function sanitizeString($var){
    global $con;
    $var = strip_tags($var);
    $var = htmlentities($var);
    $var = stripcslashes($var);
    return mysqli_real_escape_string($con,$var);
}