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)クロスサイトスクリプティング
まあ、とりあえず 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アプリケーション編は、
一通り理解するようにしてください。
htmlspecialchars()ではなくmysql_real_escape_string()を使いましょう。
pearでMDB2を導入してプリペアードステートメントを使用すると楽ちんです。
DBとやりとりする際はmysql_real_escape_string()でエスケープ
HTMLとかに出力する際はhtmlspecialchars()でエスケープ
そのまんまの回答が以下のURLで
ありがとうございます。参考になります!
ありがとうございます!「IPA セキュア・プログラミング講座」も読みます。