人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

●質問者: t_yasu
●カテゴリ:ウェブ制作
✍キーワード:LINK MySQL SET セキュリティ 接続
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● kn1967
●1ポイント

$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

◎質問者からの返答

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

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

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

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

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


2 ● pahoo
●24ポイント

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;

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


3 ● galenos
●1ポイント

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

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

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

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

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


4 ● b-wind
●37ポイント

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

addslashes でも不十分。

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

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

◎質問者からの返答

論外なんですか?

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

これでも危険ですか?

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

$value = $_POST["value"];

$value = mysql_real_escape_string($value);

$value = htmlspecialchars($value,ENT_QUOTES);


5 ● b-wind
●37ポイント

論外なんですか?

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

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

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

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

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

これでも危険ですか?

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

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

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

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

◎質問者からの返答

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ