Senin, 11 November 2013

Cara Melindungi Website PHP Anda dari SQL Injection Hacks


Sebagai web developer , saya sering membaca artikel tentang hacker ( dari rendah ke berpengetahuan ) website infiltrasi melalui metode yang ditakuti ' SQL Injection ' dan benar-benar mengambil kendali , berubah, mendapatkan akses , atau merusak data pemilik . Sebagai pengembang web rekan , saya yakin Anda ingin tahu bagaimana untuk melindungi terhadap itu . Nah , ini dia ! Pada artikel ini , Anda akan mengetahui apa SQL Injection adalah , apa yang dapat Anda lakukan untuk melindungi , dan rekomendasi tambahan yang mudah untuk dilakukan dan hanya membuat data Anda lebih aman .Harap dicatat : Saya tidak ahli ' mutlak ' , namun tidak satupun dari proyek-proyek saya pernah hack ( belum) , adalah bukti SQL Injection ( sejauh yang saya tahu) , dan aku mencintai belajar . Saya jamin tidak ada .



Apa SQL Injection dan Bagaimana Apakah Ini Digunakan ?Pada dasarnya , SQL Injection adalah metode yang digunakan terhadap situs dan aplikasi untuk mendapatkan akses ke situs web atau aplikasi data, disimpan dalam database SQL . SQL Injection digunakan untuk mendapatkan akses ke informasi database (atau seluruh perusahaan ) , untuk menghancurkan informasi database , atau untuk memanipulasi informasi database ini . Ini adalah metode yang digunakan untuk mengeksploitasi kerentanan keamanan dari aplikasi atau situs web . Ada berbagai jenis SQL Injection , tapi dalam artikel ini kita hanya akan mencakup dasar-dasar .Mari kita lihat bagaimana digunakan , untuk lebih memahami apa itu . Saya akan menggunakan PHP sebagai bahasa scripting dalam contoh ini . Anda dapat menggunakan mengganti bahasa apapun yang Anda gunakan . Fokusnya harus pada perintah SQL .contohMisalkan anda adalah seorang profesional dengan bisnis Anda sendiri . Anda telah membuat sebuah database SQL dengan tabel yang berisi semua informasi klien Anda , yang Anda gunakan untuk mengirimkan pemberitahuan penting , penagihan , dll Anda butuh satu tahun untuk mendapatkan 50.000 klien sangat penting . Anda mengelola database Anda dengan login secara online , saat Anda melakukan perjalanan , dan melakukan apa pun yang perlu Anda lakukan , langsung dari website Anda .Query SQL Anda di PHP Anda log -in naskah, di situs web Anda :

    
< ?
    
$ q = " SELECT ` id ` FROM` pengguna `WHERE ` username ` = ' " . $ _GET [ ' username ' ] . " 'AND ` password ` = ' " . $ _GET [ 'Password' ] . " ' " ;
    
? >

 Suatu hari seorang hacker memproklamirkan diri tersandung pada situs web Anda . Dia mengklik ' Log In ' tombol. Dia memasuki berikut dalam 'username' lapangan :'; SHOW TABLES ;
Hacker kini telah ditunjukkan setiap meja yang ada di database Anda .Karena dia tahu nama tabel Anda , ia masuk :'; DROP TABLE [ nama tabel Anda ] ;
 Semua informasi Anda hilang .Catatan : Ada upaya yang jauh lebih rumit dari ini , dan seseorang bisa menghabiskan banyak waktu untuk masuk ke database Anda , atau mereka bahkan dapat menggunakan suatu program untuk mencoba untuk mengeksploitasi kerentanan website Anda , database, aplikasi , dll
 
Langkah 1 Gunakan mysql_real_escape_string ( )Fungsi ini PHP lolos karakter khusus untuk digunakan dalam query SQL dan melindungi Anda dari serangan .Permintaan sekarang akan terlihat seperti ini :

<?
$q = "SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' "; 
?> 
Langkah 2 Gunakan mysql_query ( )Menggunakan ' mysql_query ( ) ' memiliki perlindungan tambahan terhadap SQL Injection . Sebuah permintaan tidak dibungkus dalam ' mysql_query ( ) ' dapat memungkinkan seorang hacker untuk menggunakan beberapa perintah SQL dari ' username' bidang Anda , bukan hanya satu , yaitu kerentanan lain. ' mysql_query ( ) ' hanya memungkinkan satu perintah pada satu waktu .Jadi , pertanyaan kita sekarang akan terlihat seperti ini :


    
< ?
    
/ / koneksi
    
$ database = mysql_connect ( " localhost " , " username" , " password" ) ;
    
/ / seleksi db
    
mysql_select_db ( "database" , $ database ) ;
    
$ q = mysql_query ( " SELECT ` id ` FROM` pengguna `WHERE ` username ` = ' " . mysql_real_escape_string ( $ _GET [ ' username ' ] ) . " ' AND ` password ` = ' " . mysql_real_escape_string ( $ _GET [ ' password '] ) . " ' " , $ database ) ;
    
? >Rekomendasi : Sentralisasi Koneksi AndaDalam naskah Anda , Anda harus memusatkan koneksi Anda ke satu halaman .Pada setiap halaman yang memerlukannya , gunakan hanya ' include () ' fungsi untuk memasukkan halaman yang host informasi koneksi database SQL Anda . Hal ini akan memaksa Anda untuk membuat query dengan format yang sama pada setiap halaman yang Anda buat , dan mengurangi kemungkinan kesalahan meninggalkan kerentanan terbuka .Jadi , katakanlah kita membuat halaman yang disebut ' connections.php ' dan dimasukkan ke dalam hal-hal berikut :

    
< ?
    
/ / koneksi
    
$ database = mysql_connect ( " localhost " , " username" , " password" ) ;
    
/ / seleksi db
    
mysql_select_db ( "database" , $ database ) ;
    
? >
    
Kita bisa memodifikasi query kita menggunakan setup baru . Halaman log -in akan memiliki:
    
< ?
    
include (" connections.php " ) ;
    
$ q = mysql_query ( " SELECT ` id ` FROM` pengguna `WHERE ` username ` = ' " . mysql_real_escape_string ( $ _GET [ ' username ' ] ) . " ' AND ` password ` = ' " . mysql_real_escape_string ( $ _GET [ ' password '] ) . " ' " , $ database ) ;
    
? >

Rekomendasi : Data yang Bersih pada Awal PageBanyak bahasa pemrograman memaksa Anda untuk mendeklarasikan variabel sebelum Anda dapat menggunakannya di seluruh script . PHP tidak memaksa Anda untuk melakukan hal ini , bagaimanapun, itu adalah kebiasaan yang baik untuk membersihkan variabel Anda di awal halaman anyway!Yakin seseorang dapat bertanya, " Jika saya membersihkan setiap variabel seluruh halaman , mengapa saya harus membersihkan variabel di atas ? Apakah saya tidak melakukan hal yang sama dengan rekomendasi Anda ? " .Hal ini lebih mudah pada Anda untuk membersihkan variabel di awal halaman untuk beberapa alasan yang berbeda , di luar format .

    
Ini mengurangi jumlah kode Anda harus menulis .
    
Setelah variabel yang bersih , Anda dapat menggunakannya secara bebas di seluruh halaman , tanpa takut kerentanan .
    
Hal ini bersih dan lebih terorganisasi , memungkinkan Anda untuk bekerja lebih mudah , dan menghindari kesalahan .Jika kita dibersihkan variabel di awal halaman , naskah kita akan terlihat seperti ini :

    
< ?
    
include (" connections.php " ) ;
    
$ username = mysql_real_escape_string ( $ _GET [ 'username' ] ) ;
    
$ password = mysql_real_escape_string ( $ _GET [ 'password' ] ) ;
    
$ q = mysql_query ( " SELECT ` id ` FROM` pengguna `WHERE ` username ` = ' " $ username . . " ' AND ` password ` = ' " $ password . . " ' " , $ database ) ;
    
? >
    
Anda bahkan bisa pergi sejauh menciptakan fungsi untuk melakukan semua pembersihan untuk Anda , mengurangi jumlah yang Anda harus mengetikkan lebih lanjut. Lihatlah contoh berikut .
    
< ?
    
Fungsi bersih ( $ input ) {
    
/ / variabel bersih, termasuk mysql_real_escape_string ( )
    
}
    
include (" connections.php " ) ;
    
$ username = bersih ( $ _GET [ 'username' ] ) ;
    
$ password = bersih ( $ _GET [ 'password' ] ) ;
    
$ q = mysql_query ( " SELECT ` id ` FROM` pengguna `WHERE ` username ` = ' " $ username . . " ' AND ` password ` = ' " $ password . . " ' " , $ database ) ;
    
? >

 Rekomendasi : Periksa Bahkan Setelah Apa Adanya DibersihkanAnda dapat memiliki pemeriksaan tambahan di tempat untuk menjaga terhadap pengolahan yang tidak perlu pada server Anda . Hal ini dicapai dengan menambahkan cek untuk naskah Anda sebelum Anda pernah sampai ke titik menjalankan query , hanya menjalankan query ketika Anda menemukan data yang dapat diterima .
    < ?
Fungsi bersih ( $ input ) {
/ / variabel bersih, termasuk mysql_real_escape_string ( )
}
include (" connections.php " ) ;
$ username = bersih ( $ _GET [ 'username' ] ) ;
$ password = bersih ( $ _GET [ 'password' ] ) ;
/ / Periksa apakah input kosong .
if ( ( $ password == '' ) | | ( $ username == '' ) ) {
/ / dont membiarkan mereka lewat
}
/ / Periksa apakah mereka menempatkan dalam terlalu banyak karakter daripada harus diperbolehkan .
lain jika ( ( strlen ( $ username ) > 20 ) | | ( strlen ( $ password ) > 20 ) ) {
/ / dont membiarkan mereka lewat
}
/ / Lulus semua kami cek ! Jalankan query.
else {
$ q = mysql_query ( " SELECT ` id ` FROM` pengguna `WHERE ` username ` = ' " $ username . . " ' AND ` password ` = ' " $ password . . " ' " , $ database ) ;
}
? >

1 komentar:

  1. bahasanya acak kadut, copas ya?

    mampir aja ke hendrangeblog.blogspot.co.id

    BalasHapus