SQL injection dan Pencegahannya

Ketika membahas mengenai database, salah satu cara yang paling umum yang sering digunakan adalah metode penyerangan yang memiliki celah yang dinamakan SQL injection.
Dari nama itu saja kita sudah sama-sama ketahui bahwa dengan menyisipkan SQL query untuk input data yang kita gunakan pada query SQL kita maka akan terjadi error atau interaksi yang tidak diinginkan oleh kita.

Misalnya,

SQL injection example with PDO

Code:
// GET data is sent through URL: http://example.com/get-user.php?id=1 OR id=2;
$id = $_GET['id'] ?? null;

// Connect to a database
$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbusername', 'dbpassword');

// Select user based on the above ID
// bingo! Ini adalah SQL code GET data yang telah disuntikan pada query. Hindari !
// because such coding and use prepared statements instead
$sql = "SELECT username, email FROM users WHERE id = " . $id;

foreach ($dbh->query($sql) as $row) {
    printf ("%s (%s)\n", $row['username'], $row['email']);
}
Kemungkinan terburuknya adalah:
"'DELETE FROM users */"

Terus gimana cara menghindarinya?
Dari artikel ini, kami kutip :
$sql = "SELECT username, email FROM users WHERE id = :id";

$sth = $dbh->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);
$sth->execute([':id' => $id]);
$users = $sth->fetchAll();

mysqli example

Jikalau menggunakan MySQL database, kamu juga bisa mencoba mysqli dengan statements yang baik, atau fungsi mysqli_real_escape_string().
// get data dikirim melalui url, sebagai contoh:
http://example.com/get-user.php?id=1 OR id=2;
$id = $_GET['id'] ?? null;

$mysqli = new mysqli('localhost', 'db_user', 'db_password', 'db_name');

if ($mysqli->connect_error) {
  die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}

$query = "SELECT username, email FROM users WHERE id = " . $id;

if ($result = $mysqli->query($query)) {
    // fetch object array
    while ($row = $result->fetch_row()) {
        printf ("%s (%s)\n", $row[0], $row[1]);
    }

    // free result set
    $result->close();
} else {
    die($mysqli->error);
}
Perbaiki statement tersebut karena akan ebih nyaman/baik untuk : mysqli_real_escape_string() tidak menerapkan quotes ("its only will escapes it").
http://example.com/get-user.php?id=1 OR id=2;
$id = $_GET['id'] ?? null;

$mysqli = new mysqli('localhost', 'db_user', 'db_password', 'db_name');

if ($mysqli->connect_error) {
   die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}

$query = "SELECT username, email FROM users WHERE id = ?";

$stmt = $mysqli->stmt_init();

if ($stmt->prepare($query)) {
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $result = $stmt->get_result();
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        printf ("%s (%s)\n", $row[0], $row[1]);
    }
}
See more reference :




Good luck Cyber Heroez !
Indonesia for better internet.
SHARE

About b3rlz

    Blogger Comment
    Facebook Comment

0 comments:

Post a Comment