オリジナルページ 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 + データベースの最新記事】
- PDO MySQL のバインドを使用した標準的な記述( ロリポップ )
- PHP で MySQLをテストする為のソースコード
- PHP で ODBC 関数を使って MS Access( データベース )にアクセスして結果を JSON 文字列として出力する
- Windows 環境の MySQL + PHP で、ODBC ドライバを使用してデータを取得する場合の3パターン
- PHP : SQLインジェクション対策付きの、MySQL のデータを JSON で返す自家製 API テスト用のテンプレート3パターン
- PHP で 自家製 API を作成して jQuery の簡単なコードで更新処理を行うサンプル
- PHP : PIPES_AS_CONCAT を使用して、CSV 作成処理をサーバの負荷にして高速に WrodPress のデータを Excel で読み込める CSV として保存する処理
- PHP : WrodPress のデータを insert SQL で保存する処理
- PHP : WrodPress のデータを Excel で読み込める CSV として保存する処理
- PHP で MySQLi 使用時の データ型定数( MYSQLI_TYPE_ ) の詳細 ( バックアップ用 insert 文を作る為 )
- PHP から MySQL の簡易的なバックアップを取得する( 但し、DBサーバがディスクへの書き込み権限を持っている必要があります )
- PHP : JSON 文字列で定義されたフォーマットを元に、そのフォーマットにセットされた配列を使って insert と update の SQL 文を自動作成。
- PHP : PDO のエラー処理
- PHP : SQLite3 を PDO の ODBC 経由で読み込み
- PHP : 5.3 / 5.2.11 用共用 sqlite3(日本語テーブル) 読み込み
- PHP : Oracle を処理する COM を使ったクラス






