SQLクエリのインジェクション対策

SQLインジェクション対策としてきっと初歩的な質問となっていて申し訳ありませんが、お教えいただければ幸いです。

前提

PHPでのSQLインジェクション対策として、例えば

php

1'SELECT * FROM users WHERE id = '. $id. ';'

のようにすると「$id」の所にSQL文を流し込めるからダメだ、というのはわかりました。

なのでそこはプレースホルダを使って「$id」などの変数の値に対してエスケープ処理をかましてあげる必要がある、と。

調べたけれどわからなかった点

今回やろうとしているのが、複数カラムを一度に検索する機能で、

php

1'SELECT * FROM users WHERE concat(title, content) = '. $keyword. ';'

というCONCAT関数でtitleカラムとcontentカラムをつなげて、その値に対して「$keyword」で検索するという手法を取ろうと考えています。

ここで気になるのが、CONCATの中身であるtitleとcontent、つまりすでにデータベースに保存されている値に関してはSQLインジェクションは起らないのか、という疑問でした。

titleの値として、SQLインジェクションで行われるようなSQLクエリを含む文字列(例:「0 OR TRUE; DELETE FROM users; --」)があらかじめデータベースに保存されてしまっていて、その文字列をCONCATしたタイミングで結局「$id」にSQLクエリを入れ込んだのと同じことになるのでは?という。

そもそもデータベースに値を保存する際にエスケープをする必要があるのか、where句のカラム側、というか検索対象側に関してはそれが例えSQLクエリであったとしてもただの文字列として扱われるのでSQLインジェクションの問題はないのか、どちらなのかなと。

すみませんがよろしくお願いいたします。

コメントを投稿

0 コメント