ホーム >  PHP >  PHPのサニタイズでSQLインジェクションを防ぐには

投稿日:   |  最終更新日:

PHPのサニタイズでSQLインジェクションを防ぐには

PHP制作

 フォームに入力された内容をそのまま使用するとデータベースを破壊されてしまう恐れがあります。いわゆる「SQLインジェクション」を防ぐにはPHPプログラムに対してサニタイズ(sanitize=無害化)という作業を行います。

SQLインジェクションとは?

①フォームに以下のような文字を入力します。
 $request = ' OR ' ' = ' ;

②サニタイズせずにSQLに流すと以下のような文になります。

 SELECT * FROM test_table WHERE password = '  ' OR ' ' = ' '

 これは、「passwordが空か、または空が空か」という条件です。「空が空」とは意味不明ですが、この条件は必ず当てはまります。そしてパスワードの検査が無駄になりテーブルの情報全てを盗み取られてしまいます。

※SQLインジェクションは犯罪です。

ファンクションを使う

mysqli_real_escape_string関数

 /x00、/n、/r、/、'、"、&#47x1aの特殊文字をエスケープします。

 SQLインジェクションの手口は色々ありますが、代表的な対策法としてmysqli_real_escape_string関数を使います。「 '(シングルクオート)」にバックスラッシュを付加して記号としての機能を消します。また、シングルクオーテーション以外の危険な文字も消去してくれます。

 $request = ' OR ' ' = ' ;

 $abc = sprintf(“SELECT * FROM test_table WHERE password = '%s'”,
    mysqli_real_escape_string($db, $request)
 );

 ※%(パーセント記号)と_(アンダーバー)はエスケープされません。%や_はこれらの文字を自前でエスケープする必要があります。

htmlspecialchars関数

 特殊文字をHTMLエンティティに変換します。

 &(アンパサンド)や'(シングルクオート)など、HTMLにおいて特殊な意味を持つ文字コードを本来の値を表示したければHTMLの表現形式に変換してやらなければなりません。 htmlspecialchars関数は、これらの変換を行った結果の文字列を返します。
変換対象となる文字は以下の通りです。

 print(htmlspecialchars($data&#91'maker_id'],ENT_QUOTES));

・&は&になる。
ENT_NOQUOTESが設定されていない場合、「"」は"になる。
ENT_QUOTESが設定されている場合のみ、 「'」は'または'になる。
・<(小なり)は&lt;になる。
・>(大なり)は&gt;になる。

 ※入力文字列の中で名前付きエンティティに関連づけられたものをすべて変換する場合は、代わりにhtmlentities()を使用してください。

トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告