Как исправить SQLite3 инъекцию: переполнение стека

Как исправить SQL-инъекцию в этом коде?

Спасибо

function safeQuery($query) {

$db = new SQLite3(dirname(__FILE__) . "/private/database.db") or die ("Unable to open database");

SQLite3::escapeString($query);

$result = $db->query($query);
$row = $result->fetchArray();

$db->close();

return $row;
}

function areUserAndPasswordValid($user, $password) {

$query = "SELECT count(*) FROM userTable WHERE username = '$user' AND password = '$password'";
$row = safeQuery($query);
$count = $row[0];

return $count > 0;
}

function getFileList($user) {

$query = "SELECT fileId, filename, createdBy, owner FROM filesTable WHERE owner = '$user'";

$db = new SQLite3(dirname(__FILE__) . "/private/database.db") or die ("Unable to open database");

$result = $db->query($query) or die ("Unable to execute query");

$rows = array();

while($row=$result->fetchArray()){
$rows[] = $row;
}

$db->close();

return $rows;
}

0

Решение

Вы должны всегда использовать подготовленные операторы, а не напрямую передавать пользовательский ввод в ваш запрос.

замещать SELECT count(*) FROM userTable WHERE username = '$user' AND password = '$password' с чем-то вроде этого:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

(Этот фрагмент кода взят из http://php.net/manual/en/pdo.prepared-statements.php)

Подготовленные операторы не позволят пользователям вводить SQL.

Увидеть Как я могу предотвратить внедрение SQL в PHP? за кучу других полезных ответов.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]