Saya punya meja test(id,name)
.
Saya harus memasukkan nilai-nilai seperti: user's log
, 'my user'
, customer's
.
insert into test values (1,'user's log');
insert into test values (2,''my users'');
insert into test values (3,'customer's');
Saya mendapatkan kesalahan jika saya menjalankan salah satu dari pernyataan di atas.
Jika ada metode untuk melakukan ini dengan benar, silakan bagikan. Saya tidak ingin ada pernyataan yang disiapkan.
Apakah mungkin menggunakan mekanisme melarikan diri sql?
Jawaban:
Literal string
Meloloskan satu kutipan
'
dengan menggandakannya ->''
adalah cara dan cara standar tentu saja:Dalam versi lama atau jika Anda masih menjalankan dengan
standard_conforming_strings = off
atau, secara umum, jika Anda menambahkan string Anda denganE
mendeklarasikan sintaks string Posix , Anda juga dapat melarikan diri dengan backslash\
:Backslash sendiri lolos dengan backslash lain. Tapi itu umumnya tidak disukai.
Jika Anda harus berurusan dengan banyak tanda kutip tunggal atau beberapa lapisan pelolosan, Anda dapat menghindari mengutip neraka di PostgreSQL dengan string yang dikutip dolar :
Untuk menghindari kebingungan di antara kutipan dolar, lebih lanjut tambahkan token unik untuk setiap pasangan:
Yang dapat disarangkan sejumlah level:
Perhatikan jika
$
karakter tersebut memiliki makna khusus dalam perangkat lunak klien Anda. Anda mungkin harus menghindarinya juga. Ini tidak terjadi dengan klien PostgreSQL standar seperti psql atau pgAdmin.Itu semua sangat berguna untuk menulis fungsi plpgsql atau perintah SQL ad-hoc. Itu tidak dapat mengurangi kebutuhan untuk menggunakan pernyataan yang disiapkan atau beberapa metode lain untuk melindungi terhadap injeksi SQL dalam aplikasi Anda ketika input pengguna dimungkinkan. @ Craig menjawab lebih banyak tentang itu. Keterangan lebih lanjut:
Nilai di dalam Postgres
Saat berurusan dengan nilai-nilai di dalam database, ada beberapa fungsi yang berguna untuk mengutip string dengan benar:
quote_literal()
atauquote_nullable()
- yang terakhir menampilkan stringNULL
untuk input nol. (Ada jugaquote_ident()
untuk double-kutipan string di mana diperlukan untuk mendapatkan SQL yang valid pengidentifikasi .)format()
dengan format specifier%L
setara denganquote_nullable()
.Suka:
format('%L', string_var)
atauconcat()
biasanya tidak baik karena mereka tidak luput dari tanda kutip tunggal dan backslash.concat_ws()
sumber
SELECT $outer$OUT$inner$INNER$inner$ER$outer$;
membuktikan bahwa tingkat 2 bersarang tidak berfungsi di sini.?Ini sangat banyak dunia yang buruk, karena pertanyaan Anda menyiratkan bahwa Anda mungkin memiliki lubang injeksi SQL yang menganga dalam aplikasi Anda.
Anda harus menggunakan pernyataan parameter. Untuk Java, gunakan
PreparedStatement
dengan placeholder . Anda mengatakan Anda tidak ingin menggunakan pernyataan parameter, tetapi Anda tidak menjelaskan mengapa , dan terus terang itu harus menjadi alasan yang sangat baik untuk tidak menggunakannya karena mereka adalah cara termudah, teraman untuk memperbaiki masalah yang Anda coba menyelesaikan.Lihat Mencegah Injeksi SQL di Jawa . Jangan menjadi korban Bobby berikutnya.
Tidak ada fungsi publik di PgJDBC untuk mengutip dan melarikan diri string. Itu sebagian karena itu mungkin membuatnya tampak seperti ide yang bagus.
Ada yang built-in mengutip fungsi
quote_literal
danquote_ident
di PostgreSQL, tetapi mereka adalah untukPL/PgSQL
fungsi yang digunakanEXECUTE
. Hari-hariquote_literal
ini sebagian besar sudah usang olehEXECUTE ... USING
, yang merupakan versi parameter , karena lebih aman dan lebih mudah . Anda tidak dapat menggunakannya untuk tujuan yang Anda jelaskan di sini, karena mereka adalah fungsi sisi server.Bayangkan apa yang terjadi jika Anda mendapatkan nilai
');DROP SCHEMA public;--
dari pengguna jahat. Anda akan menghasilkan:yang terbagi menjadi dua pernyataan dan komentar yang diabaikan:
Aduh, ini database Anda.
sumber
= ANY(?)
dan parameter array.database is accessed by java
hal ini secara langsung menjawab pertanyaan tersebut. Hal ini juga sangat penting bagi orang-orang yang datang ke sini untuk menyadari bahaya potensial, terutama mengingat SQL Injection adalah penyebab # 1 kerentanan perangkat lunak. Setelah menyadari masalah ini, orang-orang dapat membuat keputusan yang tepat kapan hal itu tidak penting, seperti kasing bootstrap Anda.Menurut dokumentasi PostgreSQL (4.1.2.1. String Constants) :
Lihat juga parameter standard_conforming_strings , yang mengontrol apakah melarikan diri dengan backslash berfungsi.
sumber
Dalam postgresql jika Anda ingin memasukkan nilai
'
di dalamnya maka untuk ini Anda harus memberikan ekstra'
sumber
Anda dapat menggunakan fungsi postrgesql chr (int):
sumber
Jika Anda perlu menyelesaikan pekerjaan dalam Pg:
to_json(value)
https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE
sumber
format()
,quote_literal()
atauquote_nullable()
untuk menghindari kutip. Lihat: stackoverflow.com/a/25143945/939860sumber
user's log
di tempat yangabc
tepat untuk memulai. Tangkap 22.