• ベストアンサー

MySQLデータベースに入力するときの質問です。

PHP, HTML, MySQLと一部javascriptで添削システムを作っています。 以下のようなページを作りました。 http://flab.aid.design.kyushu-u.ac.jp/~harano/prac/show.php HTMLタグをつけたままデータベースに保存 しています。 ですが、このままだと入力する人が勝手にHTMLタグやjavascriptのソースなどを書けてしまいます。 javascriptはあまり詳しくありませんが、データを消すようなソースを入力されてしまっては機能しません。 何かいい改善案があればどんな情報でもいいので教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

一般的にいう、SQLインジェクションとクロスサイトスクリプティング(XSS)を行えてしまう状態ですね この二つの問題は分けて考えなくては混乱するだけですので整理します HTMLのタグやJavaScriptが悪さをする瞬間というのは、ブラウザに出力するタイミングです ですからデータ入力時やデータベースに保存する場合には、HTMLやJavaScriptは何にも悪さはしません、単なる文字列としてデータベースに保存されますので、データベース保存時や選択時にHTMLタグやJavaScriptに対しては気にすることはありません。 しかし、入力欄にSQLインジェクションされるとデータ保存時や選択時に誤った処理をしてしまいますのでSQLインジェクションに対してはSQL文を生成する瞬間に対策をしなくてはなりません 入力欄 ↓ validate(文字数や、数値のみ入力させたい場合、半角英数のみの場合などの検査をする) ↓ DBにINSERT/UPDATE *SQL文を生成時にSQLインジェクション対策のエスケープをする ↓ DBからSELECT *SELECT文を生成する場合にもSQLインジェクション対策用のエスケープをする ↓ 取得されたデータを何かしら処理する ↓ HTMLとして出力する *この時にXSS用のエスケープをして出力をする ざっとこんな感じかな つまり XSSとSQLインジェクションとでは対策をする方法や場所が違うということです。 SQLインジェクションはSQL文を生成(SQL文として出力)するタイミングで、XSSはHTMLとしてブラウザに対して出力をするタイミングで ということになります さまざまなセキュリティ対策が必要ですが、どんな対策に対しても「入力は甘く、出力がギチギチに絞める」が鉄則だと私は思います。 入力されてくるデータは何が入ってくるのか分からないのでとりあえず受け取る。 出力するデータは、こちらの思うがままにギチギチに締め付けてやれば良い。 ということです。

durandal-2
質問者

お礼

SQLインジェクションですか。 XSSは他の人から教えてもらったのですが、そちらの方までとは知りませんでした。 早速、今から調べながらとりかかろうと思います。 inu2さんの回答を読んだだけで勉強になります。 分かりやすい説明をしていただきありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • wp_
  • ベストアンサー率54% (132/242)
回答No.2

No.1の方の補足となりますが。 //毎回思うがinu2さんの文は秀逸だと思うんだ・・・ 具体的には  htmlspecialchar()   http://jp.php.net/manual/ja/function.htmlspecialchars.php  mysql_real_escape_string()   http://jp.php.net/manual/ja/function.mysql-real-escape-string.php  pg_escape_string()   http://jp.php.net/manual/ja/function.pg-escape-string.php  is_numeric()   http://jp.php.net/manual/ja/function.is-numeric.php  strlen()   http://jp2.php.net/manual/ja/function.strlen.php この辺の使い方、使い時をマスターすると良いです。 他の識者はもっといろいろ知ってるかもしれません。 そのほかにも活用できる関数はありますが、その辺は工夫と努力、それとセキュリティに関する情報のアンテナを常に意識しつつ勉強すると良いです。 URLから察するに大学の課題の一環かなと思いますが、 TAなどの人の方が専門的知識豊富でしょうからそちらに当たってみるのも良いかもしれません。 バリデートって何、クロスサイトスクリプティングって何と聞けば嬉々として具体的なことを教えてくれることでしょう。 // TAの人が現場を知っててコアな人だと // デザインパターンやオブジェクト指向まで波及した話を // してくれるかもしれませんね。

durandal-2
質問者

お礼

勉強するポイントまでご親切に教えてくださって本当にありがとうございます。 これは学校の課題のようなものです。 教授に「ここの部分のセキュリティが甘い」と言われた部分でした。 頑張ります。

すると、全ての回答が全文表示されます。

関連するQ&A