Pendapatan Nama Lajur Dinamik dalam MySQL dan Java Menggunakan Penyata Disediakan: Pendekatan Lebih Selamat
Ramai pembangun MySQL dan Java telah meneroka menggunakan pernyataan yang disediakan untuk mendapatkan semula data dengan nama lajur yang dijana secara dinamik. Walau bagaimanapun, menggantikan nama lajur secara langsung ke dalam parameter pernyataan yang disediakan tidak disokong dan memperkenalkan risiko keselamatan yang ketara. Reka bentuk semula skema pangkalan data biasanya merupakan penyelesaian terbaik.
Percubaan untuk menggunakan pernyataan yang disediakan dengan cara ini, seperti yang ditunjukkan di bawah, mengakibatkan ralat:
<code class="language-java">String columnNames = "d,e,f"; String query = "SELECT a,b,c,?" + " FROM " + name + " WHERE d=?"; // This results in "SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'", not the desired result.</code>
Pertanyaan menganggap ?
pemegang tempat sebagai rentetan literal, bukan nama lajur.
Untuk mengelakkan kelemahan suntikan SQL, kaedah yang lebih mantap melibatkan penyimpanan nama lajur dinamik dalam pangkalan data itu sendiri. Pertimbangkan jadual seperti "data_pengguna" dengan lajur ini:
id
(kunci utama)user_name
column_names
(rentetan nama lajur yang dipisahkan koma)Pertanyaan SQL kemudiannya boleh dibina dengan menggabungkan column_names
yang diambil daripada jadual ini:
<code class="language-java">String query = "SELECT a,b,c," + columnNames + " FROM " + name + " WHERE d=?";</code>
Pendekatan ini memastikan bahawa nama lajur tidak dianggap sebagai parameter yang terdedah kepada serangan suntikan. Walaupun ia menggunakan penggabungan rentetan, bahagian yang terdedah (nama lajur) sudah dibersihkan dengan diambil daripada pangkalan data. Ingat, sentiasa bersihkan mana-mana data yang dibekalkan pengguna yang digunakan dalam pembinaan pertanyaan, walaupun ia bukan sebahagian langsung daripada pernyataan SQL. Pendekatan yang disemak ini menawarkan penyelesaian yang lebih selamat dan terurus untuk mengendalikan nama lajur dinamik.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Data dengan Nama Lajur Dinamik Menggunakan Penyata Disediakan dalam MySQL dan Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!