Saya mencoba untuk menempatkan beberapa injeksi anti sql di Jawa dan saya merasa sangat sulit untuk bekerja dengan fungsi string "replaceAll". Pada akhirnya saya membutuhkan fungsi yang akan mengkonversi semua yang ada \
ke \\
, "
ke \"
, '
ke \'
, dan \n
ke apa pun \\n
sehingga ketika string dievaluasi oleh MySQL, suntikan SQL akan diblokir.
Saya telah mendongkrak beberapa kode yang sedang saya kerjakan dan semua \\\\\\\\\\\
fungsinya membuat mata saya jadi gila. Jika ada orang yang memiliki contoh ini, saya akan sangat menghargainya.
CREATE VIEW myview AS SELECT * FROM mytable WHERE col = ?
karena pernyataan utama adalah pernyataan- DDL , meskipun bagian yang Anda coba untuk parameterisasi sebenarnya adalah DML .Jawaban:
PreparedStatements adalah cara yang harus dilakukan, karena mereka membuat injeksi SQL tidak mungkin. Berikut ini contoh sederhana mengambil input pengguna sebagai parameter:
Tidak peduli karakter apa yang ada dalam nama dan email, karakter-karakter itu akan ditempatkan secara langsung dalam database. Mereka tidak akan mempengaruhi pernyataan INSERT dengan cara apa pun.
Ada beberapa metode kumpulan untuk tipe data yang berbeda - yang Anda gunakan tergantung pada bidang database Anda. Misalnya, jika Anda memiliki kolom INTEGER dalam database, Anda harus menggunakan
setInt
metode. Dokumentasi PreparedStatement mencantumkan semua metode berbeda yang tersedia untuk mengatur dan mendapatkan data.sumber
Satu-satunya cara untuk mencegah injeksi SQL adalah dengan SQL parameter. Sangat tidak mungkin untuk membangun filter yang lebih pintar daripada orang yang meretas SQL untuk mencari nafkah.
Jadi gunakan parameter untuk semua input, pembaruan, dan klausa mana. Dynamic SQL hanyalah pintu terbuka bagi peretas, dan itu termasuk SQL dinamis dalam prosedur tersimpan. Parameterisasi, parameterisasi, parameterisasi.
sumber
Jika Anda benar-benar tidak dapat menggunakan Opsi Pertahanan 1: Pernyataan yang Disiapkan (Kueri Parameterized) atau Opsi Pertahanan 2: Prosedur Tersimpan , jangan membuat alat Anda sendiri, gunakan API Keamanan OWASP Enterprise . Dari OWASP ESAPI yang dihosting di Google Code:
Untuk detail lebih lanjut, lihat Mencegah Injeksi SQL di Java dan Lembar Cheat Pencegahan Injeksi SQL .
Berikan perhatian khusus pada Opsi Pertahanan 3: Melarikan Diri dari Semua Input yang Disediakan Pengguna yang memperkenalkan proyek OWASP ESAPI ).
sumber
(Ini sebagai jawaban atas komentar OP di bawah pertanyaan awal; Saya sepenuhnya setuju bahwa PreparedStatement adalah alat untuk pekerjaan ini, bukan regex.)
Ketika Anda mengatakan
\n
, apakah maksud Anda urutan\
+n
atau karakter linefeed yang sebenarnya? Jika itu\
+n
, tugasnya cukup mudah:Untuk mencocokkan satu garis miring terbalik di input, Anda menempatkan empat di string regex. Untuk memasukkan satu backslash ke dalam output, Anda memasukkan empat dari mereka ke dalam string pengganti. Ini dengan asumsi Anda membuat regex dan penggantian dalam bentuk literal Java String. Jika Anda membuatnya dengan cara lain (misalnya, dengan membacanya dari file), Anda tidak perlu melakukan semua itu dengan melarikan diri dua kali.
Jika Anda memiliki karakter linefeed di input dan Anda ingin menggantinya dengan urutan escape, Anda dapat membuat pass kedua melewati input dengan ini:
Atau mungkin Anda ingin dua backslash (saya tidak terlalu jelas tentang itu):
sumber
PreparedStatements adalah cara untuk melakukannya, tetapi tidak semua kasus. Terkadang Anda akan menemukan diri Anda dalam situasi di mana kueri, atau bagian dari itu, harus dibangun dan disimpan sebagai string untuk digunakan nanti. Lihat Lembar Cheat Pencegahan Injeksi SQL di Situs OWASP untuk detail lebih lanjut dan API dalam berbagai bahasa pemrograman.
sumber
Pernyataan yang Disiapkan adalah solusi terbaik, tetapi jika Anda benar-benar perlu melakukannya secara manual Anda juga bisa menggunakan
StringEscapeUtils
kelas dari perpustakaan Apache Commons-Lang. Ini memilikiescapeSql(String)
metode, yang dapat Anda gunakan:import org.apache.commons.lang.StringEscapeUtils; … String escapedSQL = StringEscapeUtils.escapeSql(unescapedSQL);
sumber
Menggunakan ekspresi reguler untuk menghapus teks yang dapat menyebabkan injeksi SQL terdengar seperti pernyataan SQL dikirim ke database melalui
Statement
bukanPreparedStatement
.Salah satu cara termudah untuk mencegah injeksi SQL di tempat pertama adalah dengan menggunakan
PreparedStatement
, yang menerima data untuk menggantikan pernyataan SQL menggunakan placeholder, yang tidak bergantung pada rangkaian string untuk membuat pernyataan SQL untuk dikirim ke database.Untuk informasi lebih lanjut, Menggunakan Pernyataan Disiapkan dari Tutorial Java akan menjadi tempat yang baik untuk memulai.
sumber
Jika Anda berurusan dengan sistem lama, atau Anda memiliki terlalu banyak tempat untuk beralih
PreparedStatement
dalam waktu yang terlalu sedikit - yaitu jika ada kendala untuk menggunakan praktik terbaik yang disarankan oleh jawaban lain, Anda dapat mencoba AntiSQLFiltersumber
Anda memerlukan kode berikut di bawah ini. Sekilas, ini mungkin terlihat seperti kode lama yang saya buat. Namun, yang saya lakukan adalah melihat kode sumber http://grepcode.com/file/repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.31/com/mysql/jdbc/PreparedStatement. java . Kemudian setelah itu, saya hati-hati melihat melalui kode setString (int parameterIndex, String x) untuk menemukan karakter yang lolos dan mengkustomisasi ini ke kelas saya sendiri sehingga dapat digunakan untuk keperluan yang Anda butuhkan. Lagi pula, jika ini adalah daftar karakter yang lolos dari Oracle, maka mengetahui ini benar-benar menghibur dari segi keamanan. Mungkin Oracle membutuhkan dorongan untuk menambahkan metode yang mirip dengan yang ini untuk rilis utama Java berikutnya.
sumber
mysql-connector-java-xxx
,case '\u00a5'
dancase '\u20a9'
pernyataan tampaknya telah dihapusorg.ostermiller.utils.StringHelper.escapeSQL()
ataucom.aoindustries.sql.SQLUtility.escapeSQL()
.Setelah mencari banyak pengujian solusi untuk mencegah sqlmap dari injeksi sql, dalam kasus sistem warisan yang tidak dapat menerapkan statments disiapkan di mana-mana.
topik java-security-cross-site-scripting-xss-dan-sql-injeksi ADALAH SOLUSI
saya mencoba solusi @Richard tetapi tidak berhasil dalam kasus saya. saya menggunakan filter
sumber
java-security-cross-site-scripting-xss-and-sql-injection topic
? Saya mencoba mencari solusi untuk aplikasi lawas.Dari: [Sumber]
}
sumber
Jika Anda menggunakan PL / SQL, Anda juga dapat menggunakannya
DBMS_ASSERT
untuk membersihkan input Anda sehingga Anda dapat menggunakannya tanpa khawatir tentang suntikan SQL.lihat jawaban ini misalnya: https://stackoverflow.com/a/21406499/1726419
sumber