Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Keamanan untuk pernyataan SQL yang disiapkan dengan REGEX dalam kueri

Placeholder tidak dapat dikutip. Sesederhana itu:

SELECT ... WHERE foo = ?
SELECT ... WHERE foo = '?'

Yang pertama adalah placeholder, dan berfungsi seperti yang diharapkan. Yang lainnya adalah menguji kesetaraan terhadap karakter "tanda tanya". Ini bukan tempat penampung lagi.

Lalu ada masalah ? menjadi metakarakter regex juga. Jika placeholder BISA dikutip, maka diberikan

SELECT ... WHERE foo REGEXP '^.?' 

apakah itu ? menjadi placeholder kueri, atau apakah itu operator rentang "nol-atau-satu" regex?

Jika Anda ingin menggunakan placeholder di regex, Anda harus "membangun" pola regex

SELECT ... WHERE foo REGEXP concat('^.', ?)

Persis dengan cara yang sama seperti Anda harus membuat LIKE pola:

SELECT ... WHERE foo LIKE '%?%' // wrong
SELECT ... WHERE foo LIKE concat('%', ?, '%') // right



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Looping melalui Array di PHP dikembalikan dari MySQL Query

  2. batas mysql runtuh, yang menghasilkan interaksi data

  3. Kirim email di latar belakang tanpa cron

  4. Membuat kueri database relasional melalui Google DataFlow Transformer

  5. Mencoba 'memanggil' prosedur tersimpan dengan CodeIgniter