SQLインジェクションの要点は、'と' の間に現れる文字列をどうするか、と言う事に集約されます。その文字列表現になにも問題無ければ、いかなる文字列も '(シングルクオート)にはさまれた文字列でしか無いはずだからです。 そもそも PHP を扱う場合、もともとWEBアプリケーションで使う事を想定されているので、入力文字がプログラマの意図せぬ変換されている場合があります。ですから、SQLインジェクションを考える場合はこれを排除して考える必要があります。 つまり、最初は「入力されたままの文字列がアプリケーションに渡される」という前提で考えます。その場合最初に気をつけるのが '(シングルクオート) です。 入力値の'(シングルクオート) は、SQLの常識としてそのままでは正しく動かないので、'' に変換します。通常はこれで十分なわけですが、MySQL という RDBMS を扱う上でさらに注意が必要になります。
$query = "select * from 社員マスタ"; $query .= " where 社員コード = '{$_POST['fld1']}'"; //入力値が ' or 1=1# だと、 // select * from 社員マスタ where 社員コード = '' or 1=1#' となり、 // 全件表示されてしまうので // '' or 1=1# と変換すると入力値はすべて文字列となります
これはこれで OK なのですが、\' or 1=1# と入力されてしまうと、\'' or 1=1# と変換されて、\' が '' 扱いになって、結局 以下のようになって全て選択されます( '' の間の \' は、文字列扱いの ' になるので、文字列の終端が変化してしまう )
select * from 社員マスタ where 社員コード = '\'' or 1=1#'
で、それらをふまえた上で、PHP には、MySQL のドキュメントにも出現する API である、mysql_real_escape_string という関数を使うと、一括で危険な文字を変換できます。 MySQL ドキュメント MySQL :: MySQL 5.1 リファレンスマニュアル :: 23.2.3.53 mysql_real_escape_string()
|
【DB関連の最新記事】
- 複数行のグループデータを1行にまとめるSQL
- テーブル設計書作成 : VBScript + Excel.Application + SQLServer
- select 社員コード,氏名,(select count(*) from 得意先マスタ where 担当者 = 社員コード) as 件数 from 社員マスタ : 件数を where で使いたい場合..
- SQL Server とそのコンポーネントのバージョンとエディションを確認
- land.to での PHP + PostgreSQLでの接続テスト
- SQL*PlusだけでCSVを作成する
- Oracle11g + Windows7 : InstantClient を使用した軽量接続 ( Win32 )
- MySQL:GPLな再配布。プログラムは無しでデータのみ追加
- MySQL5.1.4の半手動インストール(インストール場所の変更)
- グループ関数の原則
- Oracleエクスポートユーティリティ(expdp)パラメータ入力支援HTMLアプリケーション
- 今年もPL/SQLはFunctionから
- OracleInstantClientによる接続確認
- SYSTEMユーザからスキーマを作成、販売管理データを投入する
- BCP.EXEで自動採番列(INTIDENTITY)を持つデータの移行
- SQLExpress2005のインストールから最速設定(2)
- SQLExpress2005のインストールから最速設定(3)
- SQLExpress2005のインストールから最速設定(1)
- 【Oracle10g接続】InstantClientを使用した接続
- MySQL5.1.26をUSBメモリに入れて使用する