POSTされてきた「value」を「△△△」に挿入するとします。
下記の流れで登録を行った場合、セキュリティの観点から見て問題のある場所はありますでしょうか?
$value=htmlspecialchars($_POST["value"],ENT_QUOTES);
//MySQLへの接続文は省略します。
mysql_query("UPDATE ●●● SET △△△ = '$value' WHERE id='●●' AND pw='■■'", $link);
$value が a だとすると
mysql_query("UPDATE ●●● SET △△△ = 'a' WHERE id='●●' AND pw='■■'", $link);
$value が a' だとすると
mysql_query("UPDATE ●●● SET △△△ = 'a'' WHERE id='●●' AND pw='■■'", $link);
これはエラーが出ますね。
$value が a'; 何らかのSQLコマンド; SELECT * FROM xxx
だとすると・・・。
SQLインジェクションについてはとりあえず下記あたりがわかりやすいかと・・・。
MySQL側のバージョンやカラムのデータ型に依存する問題ですが、$value の末尾にシフトJISの 5C 文字(能、表、暴など)が入っている場合、SQL文のシングルクォーテーション(閉じの方)がエスケープされる可能性があります。
回避策としては、
それから、$_POST["value"] にマルチバイト文字が含まれており、PHPの内部処理と異なるコードで渡された場合、文字化けを起こします。この場合も、ある条件が揃うとエスケープ文字を発生させる可能性があるので、$_POST["value"] を直接 htmlspecialchars に入れるのは得策ではありません。その前に、バリデーションチェックを行う必要があります。
「ページ間での文字化けを解消する」を参考にしてください。
ご回答ありがとうございます。
サーバーの仕様で文字セットは「EUC-JP」になっていると思います。
教えていただいた「addslashes」を追加してみました。
$value = addslashes($_POST["value"]);
$value=htmlspecialchars($value,ENT_QUOTES);
//確認のため出力
echo $value;
上記だと「`」はそのまま出力されるのですが問題ありますでしょうか?
そうこうしているうちに、自己満足の権化みたいな回答者が現れましたね。
とくにknで始まる6文字・・・。
かの人は忠告無視ですから・・・。
「これはエラーが出ますね。」って・・・。
htmlspecialchars してるんだからエラーが出るわけないだろ。
問題がある無い以前に HTML 用の関数を DB に使用している時点で論外でしょ。
addslashes でも不十分。
最低限 mysql_real_escape_string かプリペアドステートメントを使わないと。
論外なんですか?
書籍で紹介されていたので大丈夫かと考えておりました。
これでも危険ですか?
//データベース接続は省略します。
$value = $_POST["value"];
$value = mysql_real_escape_string($value);
$value = htmlspecialchars($value,ENT_QUOTES);
論外なんですか?
正確に言うとSQLインジェクション対策としては論外です。
書籍で紹介されていたので大丈夫かと考えておりました。
文脈が分かりかねますのでなんともいえません。
XSS対策としてならわからなくも無いので。
ただ、それにしてもDBに入れる前に行うのはやり方として間違っています。
これでも危険ですか?
htmlspecialchars はDBに入れる値には使わないでください。処理として適切ではないです。
htmlspecialchars を行うべきところは別のページ等でDBから値を取り出し、HTML に出力する直前です。
これは以下のページの説明が分かりやすいです。
私が見た書籍はクロスサイトスクリプティングの対策です。
教えていただいたページで勉強してみます。
ありがとうございました。
早速のご回答ありがとうございました。
教えていただいたページはとても参考になります。
$value が a' だった場合なのですが、「htmlspecialchars」を行っておりますので、
mysql_query("UPDATE ●●● SET △△△ = 'a'' WHERE id='●●' AND pw='■■'", $link);
となるのではないでしょうか?