0

How To Fix SQL Injection in this code?

Thanks

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;
}
Dai
  • 141,631
  • 28
  • 261
  • 374
  • Please use code markup, not quotation, for code blocks. That way the indentation won't be messed up. – Barmar Nov 18 '14 at 03:31

1 Answers1

2

You should always use prepared statements rather than directly passing user input into your query.

Replace SELECT count(*) FROM userTable WHERE username = '$user' AND password = '$password' with something like this:

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

(That code snippet taken from http://php.net/manual/en/pdo.prepared-statements.php)

Prepared statements will prevent users from injecting SQL.

See How can I prevent SQL injection in PHP? for a bunch of other useful answers.

Community
  • 1
  • 1
Cameron Skinner
  • 51,692
  • 2
  • 65
  • 86