${}
dan #{} kedua-duanya digunakan untuk menggantikan parameter dalam MyBatis SQL akhirnya dijana oleh MyBatis, tetapi mereka sangat berbeza Mari kita lihat mereka seterusnya.
${} adalah untuk menggantikan terus parameter ke dalam SQL , Contohnya, kod berikut:
<select id="getUserById" resultType="com.example.demo.model.UserInfo"> select * from userinfo where id=${id} </select>
SQL pelaksanaan akhir yang dijana adalah seperti berikut:
Seperti yang dapat dilihat daripada rajah di atas, parameter sebelumnya ${id} ialah diganti terus dengan parameter tertentu Nilainya ialah 1. Dan #{} menggunakan ruang letak dan prapemprosesan untuk melaksanakan perniagaan Kami mengubah kes di atas ke dalam bentuk #{}. Kod pelaksanaan adalah seperti berikut:
rreee<. 🎜>SQL yang dijana akhir adalah seperti berikut:
1.1 masalah ${}Apabila parameter ialah Apabila menggunakan jenis angka (tanpa mengambil kira isu keselamatan), dan #{} mempunyai kesan pelaksanaan yang sama Namun, apabila jenis parameter ialah aksara, akan ada masalah apabila menggunakan ${}, ${}
Seperti yang ditunjukkan dalam kod berikut: <. 🎜><select id="getUserById" resultType="com.example.demo.model.UserInfo">
select * from userinfo where id=#{id}
</select>
Cara ini akan menyebabkan program untuk melaporkan ralat, kerana parameter yang diluluskan adalah daripada jenis aksara, dan dalam sintaks SQL, jika ia adalah jenis aksara, petikan tunggal perlu ditambah pada nilai, jika tidak, ralat akan dilaporkan dan
ialah penggantian langsung dan tidak akan menambah tanda petikan tunggal secara automatik, jadi ralat akan dilaporkan apabila dilaksanakan. Penggunaan #{} menggunakan pra-pelaksanaan pemegang tempat, jadi tiada masalah kod pelaksanaannya adalah seperti berikut:<select id="getUserByName" resultType="com.example.demo.model.UserInfo"> select * from userinfo where name=${name} </select>
${}
SQL pelaksanaan akhirnya dijana oleh program di atas adalah seperti berikut: <🎜. >2. Senario penggunaan yang berbeza
Walaupun menggunakan kaedah #{} boleh mengendalikan sebarang jenis parameter, apabila parameter yang diluluskan ialah arahan SQL atau SQL Apabila kata kunci #{} digunakan, akan ada masalah. Sebagai contoh, apabila kita ingin membuat pertanyaan berdasarkan harga dari tinggi ke rendah (urutan terbalik), atau dari rendah ke tinggi (urutan hadapan)Pada masa ini kita ingin lulus kata kunci pengisihan, desc terbalik susunan ( harga dari tinggi ke tinggi Rendah) atau urutan positif asc (harga dari rendah ke tinggi), pada masa ini kami menggunakan kod pelaksanaanRyan:
<select id="getUserByName" resultType="com.example.demo.model.UserInfo"> select * from userinfo where name=#{name} </select>
${}
SQL pelaksanaan dan hasil berjalan yang dihasilkan mengikut kod di atas adalah seperti berikut:
Walau bagaimanapun, jika ${} dalam kod ditukar kepada #{}, maka pelaksanaan program akan laporkan ralat. Kod pelaksanaan #{} adalah seperti berikut:
<select id="getAll" resultType="com.example.demo.model.Goods"> select * from goods order by price ${sort} </select>
Daripada hasil pelaksanaan di atas Kita dapat melihat bahawa:
Apabila melepasi parameter biasa, anda perlu menggunakan #{}, dan apabila menghantar arahan SQL atau kata kunci SQL, anda perlu menggunakan untuk mengubah suai parameter dalam SQL secara langsung. 3. Keselamatan yang berbeza ${}
${}
3.1 Gunakan ${} untuk melaksanakan log masuk pengguna ${}
<select id="getAll" resultType="com.example.demo.model.Goods"> select * from goods order by price #{sort} </select>
<select id="login" resultType="com.example.demo.model.UserInfo"> select * from userinfo where name='${name}' and password='${password}' </select>
Seperti yang dapat dilihat daripada keputusan, apabila kita Apabila nama pengguna dan kata laluan yang betul dimasukkan, data boleh berjaya disoal. Walau bagaimanapun, apabila kami menggunakan , apabila kami tidak mengetahui kata laluan yang betul, kami juga boleh menggunakan pernyataan suntikan SQL untuk mendapatkan maklumat peribadi pengguna Kod pelaksanaan suntikan SQL adalah seperti berikut:
@Test void login() { UserInfo userInfo = userMapper.login("java", "java"); System.out.println(userInfo); }
${}
dan ke atas SQL pelaksanaan dan hasil larian yang dijana oleh kod adalah seperti berikut:
从上述结果可以看出,当使用 ${} 时,在不知道正确密码的情况下也能得到用户的私人数据,这就像一个小偷在没有你们家钥匙的情况下,也能轻松的打开你们家大门一样,这是何其恐怖的事情。那使用 #{} 有没有安全问题呢?接下来我们来测试一下。
首先将 UserMapper.xml 中的代码改成以下内容:
<select id="login" resultType="com.example.demo.model.UserInfo"> select * from userinfo where name=#{name} and password=#{password} </select>
接着我们使用上面的 SQL 注入来测试登录功能:
@Test void login() { UserInfo userInfo = userMapper.login("java", "' or 1='1"); System.out.println(userInfo); }
最终生成的 SQL 和执行结果如下:
从上述代码可以看出,使用 SQL 注入是无法攻破 #{} 的“大门”的,所以可以放心使用。
Atas ialah kandungan terperinci Apakah perbezaan antara ${} dan #{} dalam java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!