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

0

Как исправить 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
    Пожалуйста, используйте кодовую разметку, а не кавычки, для блоков кода. Таким образом, отступ не будет испорчен.
Теги:
sqlite3

1 ответ

2

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

Заменить 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? за кучу других полезных ответов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню