Saya ingin memiliki fungsi yang berperilaku sebagai mysql_real_escape_string tanpa terhubung ke database karena terkadang saya perlu melakukan pengujian kering tanpa koneksi DB. mysql_escape_string tidak digunakan lagi dan karena itu tidak diinginkan. Beberapa temuan saya:
http://www.gamedev.net/community/forums/topic.asp?topic_id=448909
Jawaban:
Tidak mungkin untuk melepaskan string dengan aman tanpa koneksi DB.
mysql_real_escape_string()
dan pernyataan yang disiapkan membutuhkan koneksi ke database sehingga mereka dapat melarikan diri dari string menggunakan set karakter yang sesuai - jika tidak, serangan injeksi SQL masih dimungkinkan menggunakan karakter multi-byte.Jika Anda hanya menguji , Anda juga dapat menggunakan
mysql_escape_string()
, itu tidak dijamin 100% terhadap serangan injeksi SQL, tetapi tidak mungkin untuk membangun sesuatu yang lebih aman tanpa koneksi DB.sumber
mysql_escape_string
tanpa koneksi (masih mencoba mencari tahu mengapa). Karena fungsi itu sudah usang, saya hanya ingin tahu bagaimana saya bisa menggantinya. Tampaknya masuk akal bahwa seseorang dapat menentukan "rangkaian karakter yang sesuai" dalam fungsi apa pun yang menggantikannya tanpa membuka koneksi.Nah, menurut halaman referensi fungsi mysql_real_escape_string : "mysql_real_escape_string () memanggil fungsi pustaka MySQL mysql_real_escape_string, yang lolos dari karakter berikut: \ x00, \ n, \ r, \, '," dan \ x1a. "
Dengan mengingat hal itu, maka fungsi yang diberikan di tautan kedua yang Anda posting harus melakukan apa yang Anda butuhkan:
function mres($value) { $search = array("\\", "\x00", "\n", "\r", "'", '"', "\x1a"); $replace = array("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z"); return str_replace($search, $replace, $value); }
sumber
mb_strpos()
(danmb_substr()
membuat perilaku serupasubstr_replace()
) untuk melakukan ini?Bertentangan langsung dengan jawaban saya yang lain, fungsi berikut ini mungkin aman, bahkan dengan karakter multi-byte.
// replace any non-ascii character with its hex code. function escape($value) { $return = ''; for($i = 0; $i < strlen($value); ++$i) { $char = $value[$i]; $ord = ord($char); if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126) $return .= $char; else $return .= '\\x' . dechex($ord); } return $return; }
Saya berharap seseorang yang lebih berpengetahuan dari saya dapat memberi tahu saya mengapa kode di atas tidak berfungsi ...
sumber
Dari penelitian lebih lanjut, saya telah menemukan:
http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html
Perbaikan Keamanan:
Lubang keamanan injeksi SQL telah ditemukan dalam pemrosesan pengkodean multi-byte. Bug ada di server, salah mengurai string yang lolos dengan fungsi API C mysql_real_escape_string ().
Kerentanan ini ditemukan dan dilaporkan oleh Josh Berkus dan Tom Lane sebagai bagian dari kolaborasi keamanan antar proyek dari konsorsium OSDB. Untuk informasi lebih lanjut tentang injeksi SQL, silakan lihat teks berikut.
Diskusi. Lubang keamanan injeksi SQL telah ditemukan dalam pemrosesan pengkodean multi-byte. Lubang keamanan injeksi SQL dapat mencakup situasi di mana ketika pengguna memberikan data untuk dimasukkan ke dalam database, pengguna dapat memasukkan pernyataan SQL ke dalam data yang akan dieksekusi oleh server. Berkenaan dengan kerentanan ini, ketika karakter set-unaware escaping digunakan (misalnya, addlashes () di PHP), adalah mungkin untuk melewati escaping di beberapa set karakter multi-byte (misalnya, SJIS, BIG5 dan GBK). Akibatnya, fungsi seperti addlashes () tidak dapat mencegah serangan injeksi SQL. Tidak mungkin untuk memperbaikinya di sisi server. Solusi terbaik adalah untuk aplikasi menggunakan pelarian karakter set-aware yang ditawarkan oleh fungsi seperti mysql_real_escape_string ().
Namun, bug terdeteksi dalam cara server MySQL mengurai output mysql_real_escape_string (). Akibatnya, bahkan ketika karakter set-aware function mysql_real_escape_string () digunakan, injeksi SQL dimungkinkan. bug ini telah diperbaiki.
Solusi. Jika Anda tidak dapat memutakhirkan MySQL ke versi yang menyertakan perbaikan bug dalam parsing mysql_real_escape_string (), tetapi menjalankan MySQL 5.0.1 atau lebih tinggi, Anda dapat menggunakan mode SQL NO_BACKSLASH_ESCAPES sebagai solusinya. (Mode ini diperkenalkan di MySQL 5.0.1.) NO_BACKSLASH_ESCAPES mengaktifkan mode kompatibilitas standar SQL, di mana garis miring terbalik tidak dianggap sebagai karakter khusus. Hasilnya adalah kueri akan gagal.
Untuk mengatur mode ini untuk koneksi saat ini, masukkan pernyataan SQL berikut:
SET sql_mode='NO_BACKSLASH_ESCAPES';
Anda juga dapat menyetel mode secara global untuk semua klien:
SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';
Mode SQL ini juga dapat diaktifkan secara otomatis ketika server dimulai dengan menggunakan opsi baris perintah --sql-mode = NO_BACKSLASH_ESCAPES atau dengan mengatur sql-mode = NO_BACKSLASH_ESCAPES di file opsi server (misalnya, my.cnf atau my.ini , tergantung pada sistem Anda). (Bug # 8378, CVE-2006-2753)
Lihat juga Bug # 8303.
sumber
NO_BACKSLASH_ESCAPES
kerentanan lainnya .