ความแตกต่างระหว่าง # และ $ ใน mybatis
1. # ปฏิบัติต่อข้อมูลที่เข้ามาทั้งหมดเป็นสตริงและเพิ่มคำพูดสองครั้งลงในข้อมูลขาเข้าโดยอัตโนมัติ ตัวอย่างเช่น: สั่งซื้อโดย #user_id #หากค่าที่ส่งผ่านคือ 111 จากนั้นค่าเมื่อการแยกวิเคราะห์เป็น SQL เป็นคำสั่งซื้อโดย "111" หากค่าที่ส่งผ่านคือ ID การแยกวิเคราะห์เป็น SQL จะเป็นคำสั่งซื้อโดย "ID"
2. $ แสดงข้อมูลที่ผ่านโดยตรงและสร้างใน SQL ตัวอย่างเช่น: สั่งซื้อโดย $ user_id $ หากค่าที่ส่งผ่านคือ 111 จากนั้นค่าเมื่อแยกวิเคราะห์ลงใน SQL เป็นคำสั่งซื้อโดย user_id หากค่าที่ส่งผ่านคือ ID การแยกวิเคราะห์เป็น SQL จะเป็นคำสั่งซื้อตาม ID
3. วิธี # สามารถป้องกันการฉีด SQL ได้อย่างมาก
4. วิธี $ ไม่สามารถป้องกันการฉีด SQL
5. โดยทั่วไปวิธี $ จะใช้ในการส่งผ่านในวัตถุฐานข้อมูลเช่นการส่งผ่านในชื่อตาราง
6. โดยทั่วไปถ้าคุณสามารถใช้ #อย่าใช้ $
ป้องกันการฉีด SQL
หมายเหตุ: อย่าเขียนคำสั่ง SQL เป็น SELECT * จาก T_STU โดยที่ s_name เช่น '%$ name $%' ซึ่งมีความเสี่ยงอย่างยิ่งต่อการโจมตีการฉีด
พารามิเตอร์ในรูปแบบ "$ {xxx}" จะเข้าร่วมโดยตรงในการรวบรวม SQL ซึ่งจะป้องกันการโจมตีแบบฉีด อย่างไรก็ตามเมื่อมาถึงชื่อตารางและชื่อคอลัมน์แบบไดนามิกคุณสามารถใช้รูปแบบพารามิเตอร์เช่น "$ {xxx}" เท่านั้น
เมื่อเขียนคำสั่ง MyBatis Mapping ให้ลองใช้รูปแบบ "#{xxx}" หากคุณต้องใช้พารามิเตอร์เช่น "$ {xxx}" คุณต้องทำงานกรองได้ดีด้วยตนเองเพื่อป้องกันการโจมตีการฉีด SQL
ตัวอย่าง
<sql id = "itemit_where"> <isNotEmpty property = "companyName" prepend = "และ"> t1.company_name เช่น # companyName # </isNotEmpty> </sql>
รหัส Java นั้นคล้ายกับรหัสดั้งเดิมของคุณ แต่ไม่มีอะไรผิดปกติ หากคุณคิดว่ามันเป็นเรื่องยากที่จะห่อหุ้มโมฆะและ '%' เป็นวิธีเดียว
if (! stringutil.isempty (this.companyname)) {table.setCompanyname ("%" + this.companyname + "%"); -ข้างต้นคือการอภิปรายสั้น ๆ เกี่ยวกับความแตกต่างระหว่าง # และ $ ใน mybatis และวิธีการป้องกันการฉีด SQL ฉันหวังว่าทุกคนจะสนับสนุน wulin.com เพิ่มเติม ~