Предотвратить SQL инъекцию в PHP - PullRequest
0 голосов
/ 17 апреля 2020

Я бы хотел предотвратить атаки SQL на этот фрагмент кода PHP (это всего лишь практическое упражнение в классе). Это можно легко использовать, установив @mail равным чему-то вроде '); DROP TABLE PURCHASE; --

$db = new SQLite3 ($db_name);

$sql = sprintf ("INSERT INTO PURCHASE (quantity, name, password, mail) 
                 VALUES ('%s', '%s', '%s', '%s')\n",
                 $Quantity, $Name, $Password, $Mail );

echo $sql;
if (!$db->exec ($sql)) {
    throw new Exception($db->lastErrorMsg());
}

Я пытался предотвратить это, передавая параметры, подобные этому, но я получаю 500 Internal Server Error

$db = new SQLite3 ($db_name);

$sql = $db->prepare("INSERT INTO PURCHASE(quantity, name, password, mail)
            VALUES (:Quantity, :Name, :Password, :Mail)");

$sql->bindValue(':Quantity', $Quantity, SQLITE3_TEXT);
$sql->bindValue(':Name', $Name, SQLITE3_TEXT);
$sql->bindValue(':Password', $Password, SQLITE3_TEXT);
$sql->bindValue(':Mail', $Mail, SQLITE3_TEXT);

echo $sql;
if (!$db->exec ($sql)) {
    throw new Exception($db->lastErrorMsg());
}

Как я могу это исправить?

1 Ответ

3 голосов
/ 17 апреля 2020

SQLite3::exec - для выполнения строки запроса, а не для подготовленного оператора. Вам нужно использовать SQLite3Stmt::execute. Измените:

if (!$db->exec ($sql)) {
    throw new Exception($db->lastErrorMsg());
}

на

if (!$sql->execute()) {
    throw new Exception($db->lastErrorMsg());
}

Обратите внимание, что вы не можете echo $sql, поскольку это объект, а не простой тип. Если вы хотите посмотреть, как выглядит SQLite3Stmt объект, вам нужно print_r($sql) или var_dump($sql).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...