Как исправить 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;
}
Вы должны всегда использовать подготовленные операторы, а не напрямую передавать пользовательский ввод в ваш запрос.
замещать 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? за кучу других полезных ответов.
Других решений пока нет …