MySQLに値を挿入するときについての質問です。


POSTされてきた「value」を「△△△」に挿入するとします。
下記の流れで登録を行った場合、セキュリティの観点から見て問題のある場所はありますでしょうか?

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

//MySQLへの接続文は省略します。

mysql_query("UPDATE ●●● SET △△△ = '$value' WHERE id='●●' AND pw='■■'", $link);

回答の条件
  • 1人2回まで
  • 登録:2008/08/29 18:56:10
  • 終了:2008/08/30 09:26:56

回答(5件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012008/08/29 19:25:28

ポイント1pt

$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インジェクションについてはとりあえず下記あたりがわかりやすいかと・・・。

http://www.atmarkit.co.jp/fsecurity/column/ueno/42.html

id:t_yasu

早速のご回答ありがとうございました。

教えていただいたページはとても参考になります。

$value が a' だった場合なのですが、「htmlspecialchars」を行っておりますので、

mysql_query("UPDATE ●●● SET △△△ = 'a'' WHERE id='●●' AND pw='■■'", $link);

となるのではないでしょうか?

2008/08/29 19:36:59
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332008/08/29 20:01:01

ポイント24pt

MySQL側のバージョンやカラムのデータ型に依存する問題ですが、$value の末尾にシフトJISの 5C 文字(能、表、暴など)が入っている場合、SQL文のシングルクォーテーション(閉じの方)がエスケープされる可能性があります。

回避策としては、

  • 文字セットとしてシフトJISを使わない
  • シフトJISを使う場合はaddcslashesする

それから、$_POST["value"] にマルチバイト文字が含まれており、PHPの内部処理と異なるコードで渡された場合、文字化けを起こします。この場合も、ある条件が揃うとエスケープ文字を発生させる可能性があるので、$_POST["value"] を直接 htmlspecialchars に入れるのは得策ではありません。その前に、バリデーションチェックを行う必要があります。

ページ間での文字化けを解消する」を参考にしてください。

id:t_yasu

ご回答ありがとうございます。

サーバーの仕様で文字セットは「EUC-JP」になっていると思います。

教えていただいた「addslashes」を追加してみました。

$value = addslashes($_POST["value"]);

$value=htmlspecialchars($value,ENT_QUOTES);

//確認のため出力

echo $value;

上記だと「`」はそのまま出力されるのですが問題ありますでしょうか?

2008/08/29 20:19:35
id:galenos No.3

galenos回答回数2ベストアンサー獲得回数02008/08/29 20:17:11

ポイント1pt

そうこうしているうちに、自己満足の権化みたいな回答者が現れましたね。

とくにknで始まる6文字・・・。

かの人は忠告無視ですから・・・。

「これはエラーが出ますね。」って・・・。

htmlspecialchars してるんだからエラーが出るわけないだろ。

id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402008/08/29 20:49:31

ポイント37pt

問題がある無い以前に HTML 用の関数を DB に使用している時点で論外でしょ。

addslashes でも不十分。

最低限 mysql_real_escape_string かプリペアドステートメントを使わないと。

2006-02-11 - hoshikuzu | star_dust の書斎

id:t_yasu

論外なんですか?

書籍で紹介されていたので大丈夫かと考えておりました。

これでも危険ですか?

//データベース接続は省略します。

$value = $_POST["value"];

$value = mysql_real_escape_string($value);

$value = htmlspecialchars($value,ENT_QUOTES);

2008/08/29 20:58:52
id:b-wind No.5

b-wind回答回数3344ベストアンサー獲得回数4402008/08/29 22:17:58

ポイント37pt

論外なんですか?

正確に言うとSQLインジェクション対策としては論外です。

書籍で紹介されていたので大丈夫かと考えておりました。

文脈が分かりかねますのでなんともいえません。

XSS対策としてならわからなくも無いので。

ただ、それにしてもDBに入れる前に行うのはやり方として間違っています。

これでも危険ですか?

htmlspecialchars はDBに入れる値には使わないでください。処理として適切ではないです。

htmlspecialchars を行うべきところは別のページ等でDBから値を取り出し、HTML に出力する直前です。

これは以下のページの説明が分かりやすいです。

「サニタイズ言うなキャンペーン」私の解釈

id:t_yasu

私が見た書籍はクロスサイトスクリプティングの対策です。

教えていただいたページで勉強してみます。

ありがとうございました。

2008/08/29 23:10:30

コメントはまだありません

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

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

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

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