■PHPでMysqlと接続する時の質問です。セキュリティー面で添削、指摘して下さい。

PHPを勉強中です。現在下記のような記述でMysqlへのデータの出し入れを行っております。
セキュリティー面などで、考慮する点などありましたらご指摘下さい。


■データを入力する時
if ($_SERVER["REQUEST_METHOD"]=="POST"){
if (isset($_POST["hoge"])){

$hoge = htmlspecialchars($_POST["hoge"], ENT_QUOTES);

if($hoge == ""){ //変数内容に合わせてチェック
$error[] = "未入力";
}

if($error == ""){
//DBに登録
$sql = sprintf("INSERT INTO hoge (hoge) VALUES('%s')",$hoge);
$mysql->query($sql); //接続クラスで、mysql_query();
}
}
}


■データを取得する時
if ($_SERVER["REQUEST_METHOD"]=="GET"){
if (isset($_GET["hoge"])){

$hoge = htmlspecialchars($_GET["hoge"], ENT_QUOTES);

$mysql->query("SELECT * FROM hoge WHERE hoge = '$hoge'");
$row = $mysql->fetch(); //接続クラスで、mysql_fetch_array();

echo $row['hoge'];//書き出し
}
}

回答の条件
  • 1人2回まで
  • 登録:2009/10/23 18:22:50
  • 終了:2009/10/30 18:25:02

回答(2件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/10/23 20:33:01

ポイント35pt

(1)クロスサイトスクリプティング

まあ、とりあえず htmlspecialchars で・・・。


(2)SQLインジェクション

もしも $hoge が a'),('b'),('c だったら、

INSERT INTO hoge (hoge) VALUES ('a'),('b'),('c')

もしも $hoge が $hoge' OR '' = ' だったら、

SELECT * FROM hoge WHERE hoge = '$hoge' OR '' = ''

などなど・・・

SQLに渡すに相応しいデータかどうかを詳細にチェックしないと、

情報改ざんや情報漏洩を起こしてしまいかねず、かなりの注意が必要。


この関数だけで対処できるという便利なものは存在しないけど、少なくとも

PHP: mysql_real_escape_string - Manualは必須。


いきなりは難しいと思うので今は言葉だけでも良いと思いますが、

バインド(事前にSQLを動かす準備だけをMySQLに行わせ、パラーメータは後から渡す

という手法のためSQLインジェクションの危険性はかなり軽減される)を使うなども、

検討する場面があるかもしれません。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 11.1.7.1 mysql_prepare()

(MySQL側はちょっと前からサポートしてますが、

レンタルサーバではphp側がサポートしていない可能性あり。)


(3)横入り禁止

GETよりPOST、POSTよりセッションなど外部から出来るだけ操作し辛くする。


こまごま言い出したら長くなるので、以上とりあえずとなりますが、

IPA セキュア・プログラミング講座:Webアプリケーション編は、

一通り理解するようにしてください。

id:yamanekomaabo

ありがとうございます!「IPA セキュア・プログラミング講座」も読みます。

2009/10/25 18:31:58
id:scrap49 No.2

scrap49回答回数18ベストアンサー獲得回数42009/10/23 22:23:56

ポイント35pt

htmlspecialchars()ではなくmysql_real_escape_string()を使いましょう。

pearでMDB2を導入してプリペアードステートメントを使用すると楽ちんです。

DBとやりとりする際はmysql_real_escape_string()でエスケープ

HTMLとかに出力する際はhtmlspecialchars()でエスケープ


そのまんまの回答が以下のURLで

http://q.hatena.ne.jp/1220003768

id:yamanekomaabo

ありがとうございます。参考になります!

2009/10/25 18:32:01
  • id:kn1967
    > http://q.hatena.ne.jp/1220003768

    確かに・・・、htmlspecialchars があるのだから、
    2の「もしも」から「などなど・・・」の部分は余計。

    同じ過ちを犯している点、ご指摘感謝。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません