SQLの窓

2010年01月21日


PHPのマニュアルにある、SQLインジェクション攻撃の例

オリジナルページ
PHP: mysql_real_escape_string - Manual

この例では、パスワードを正しく入力しなくても、ユーザの存在チェックがなされた事になってしまいます。( ※ mysql_fetch_row が行を取得してしまう )

また、この場合はユーザーが一致する必要があるのですが、以下のようにすると、ユーザー名が解らなくでもクエリが
行を返す事になります( 但し全てのユーザを返す複数行になります )

$_POST['username'] = "' OR '' != ''";
$_POST['password'] = "'";

よって、入力値に mysql_real_escape_string を使用する事が必要になります
<?
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );


$server = 'localhost';
$dbname = 'lightbox';
$user = 'root';
$password = 'password';

// 接続解除
$connect = @mysql_connect( $server, $user, $password );
if ( !$connect ) {
	print "接続エラーです";
	exit();
}

// DB選択
mysql_select_db( $dbname, $connect );


// データベース上のユーザに一致するかどうかを調べる
$_POST['username'] = 'lightbox';
$_POST['password'] = "' OR ''='";

$query = <<<QUERY
SELECT * FROM users
	WHERE user = '{$_POST['username']}'
	 AND password = '{$_POST['password']}'
QUERY;

$result = mysql_query($query,$connect);
print_r($result);
print "<pre>";
print_r(mysql_fetch_row($result));
print "</pre>";

?>

但し、入力のキャラクタセットが shift_jis の場合、この関数では、日本語に \ が含まれる文字をエスケープしてしまうので個別に注意が必要です。


また、SQL インジェクションに対する基本的な対処として、

1) DBにスーパーユーザーまたはデータベースの所有者として接続しない

2) 指定された入力が期待するデータ型であることを確認

3) データベースに渡される数値以外のユーザ入力が想定しているキャラクタセットか確認

4) 3) でOKならば mysql_real_escape_string でエスケープ

が上げられます。


関連する記事

PHP+MySQLで、SQLインジェクション対策の為に、一括で mysql_real_escape_string を行う一つの手段


タグ:SQL
【PHP + データベースの最新記事】
posted by lightbox at 2010-01-21 12:11 | PHP + データベース | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり