• ベストアンサー

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

  • MYSQL,PHPで分からないことがあります。

    PHP、HTML、MYSQLを使って、WEBで文書の添削をするシステムを作っています。 今の現状は、<FORM>で文書を書き直してもらい、原文と添削後の文を同時に表示するだけで、添削部分は自分で見極めなければなりません。 そこで、添削部分の色を変えて表示しようと思ってます。 ヤフーメールやホットメールのように入力テキストの色を変更して保存するにはどのようにすればいいでしょうか?? また、変更した色のテキストはそのままデータベースに保存できるのでしょうか?? 知識不足ですみませんが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • mySQLのデータベースにhtmlのコードをそのまま保存することはできますか?

    mySQLのデータベースにhtmlのコードを保存させて、ブログのように管理したいと考えています。けれど、微妙に元のコードが変形してしまって困っています。 フォームを作って、そこに <p style="font-size:18pt;">aiueo</p> このように入力して、そのまんまの形でデータベースに保存させたいのですが、 <p style=\"font-size:18pt;\">aiueo</p> このようにクォーテーションマークの前にバックスラッシュが挿入されてしまいます。 これが原因で、CSSなどが機能せず困っています。誰か分かる方いますでしょうか?ブログなどはどうやっているのでしょうか? 助けてください。ヒントになるソースなどでも教えていただけると助かります。 作業環境は、 データベース mySQL サーバー言語 php, ZendFramework それから、フォームの送信時にjavascript(jQuery Form)を媒介させて入力チェックなどを行っています。 windowsXP

  • PHPでMySQLのデーターベースが書込み出来ない

    PHPとMySQLとJAVAスクリプトで作成しましたデーターベースについてお尋ねします。 PHPとMySQLで作成したデータベースの検索したり、読み込みを普通に可能ですが、書き込み及び、削除が出来ません。 PhpMyAdminでは書けます(データー入力出来ます)が、PHPプログラムからはデーターを入力したり、削除を行うことが出来ません。 そして、全くエラーも出ません。 PHP上では「書き込みました」と、いかにも正常なようなメッセージが返ってきます。 が、中身は空です。 システムが出来上がって問題なく3年以上使用していたのですが、自宅のLINUXサーバーのHDDが壊れましたので、再度システム構築をやり直しました。 MySQLとPHPも再インストールを行い再構築を行いました。 その後上記症状が出て書き込み、削除が出来なくなりました。 PHPのプログラムは全く触っておらず、変更も更新もしておりません。 念のためプログラムのチェックも何度もしておりますが、勿論これといって問題は見あたりません。 PHP.INI等の設定ファイルに問題があるのでしょうか。 それとも、MySQLに問題が有るのでしょうか。 宜しくご教授の程お願い致します。

  • MySQLの挙動が変に・・・

    CentOS5.3を使用し、PHPのバージョンを4系から5.3へバージョンアップしたらMySQLの挙動が変になりました。 これまでは、 # mysql -u -p [enter]でパスワードを要求され、パスワード入力後MySQLにログインできていて、 mysql>show databases;を実行するとこれまでのデータベース一覧が当然出てきました。 バージョンアップ後、 # mysql -u -p [enter]でパスワード要求もなくログインされ、 mysql>show databases;を実行すると、 +--------------------+ | Database +--------------------+ | information_schema | test +--------------------+ のみ表示されます。 どうしてこうなったのかわかりません。 PHPのバージョンアップは以下のとおりしました。 以前のPHPバージョンを削除 yum remove php php-* 5.3のインストール # yum install php53 php53-mbstring php53-mysql なお、WordPressをインストールした際にも以前は通常通りインストールできたのですが、 5.3にしてからは 「データベース接続確立エラー」と表示されDBへ接続できないようで困っています。 以前質問させていただいた時に 「MySqlの設定が初期化されたかMySqlも更新されたかです。」とご教授をいただいき、 # ls /etc/my.cnf* を実行したところ、すでに /etc/my.cnf my.cnfが存在しております。 当該サーバーに以前より現存していたDBを使ったサイトの閲覧も可能なので、どうなっているのかわかりません。 緊急性を要し、再度ご質問させていただきました。 大変申し訳ございませんが、ご教授よろしくお願いします。

  • html,javascript,php,mysqlの発音

     英語でHtml,javascript,php,mysqlはそのままで呼びます。日本語でどうのような発音するんですか?  よく言われる言い方は教えてください。  よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • MySQLデータベースについて

    データベースについて詳しい方にお聞きしたい事があります。 初心者なので書いている内容におかしな点もあるかと思いますが、よろしくお願いします。 5年ほど前のJavaを習っていて、簡単なデータベースを作ったことはあります。 □現在、会社が違うレンタルサーバーを一つずつ借りています。 A社のサーバー上で作成したデータベースをB社のサーバー上に公開しているサイトから呼び出し、テーブルを一覧表示できるのでしょうか? □初心者がデータベースを作成するにはphpMyAdminを使用するのが一番良いでしょうか? 使い方を検索してみたらちょっと難しそうですね。 Javaでデータベースの勉強をしていた時はあらかじめ作ったフォームにデータを入力していくだけだったので、同じような感じのシステムはないかなと思いました。 □現在使用しているサーバーはMySQLが5つ使えると書いています。 既にWordPressでブログ開設していて4つ使用しています。残りは一つ。 野球チームのデータベースを作成しようと思っているのですが、これまでの試合の記録のデータ、これまでの選手のデータのデータベースを作成したいと思っています。 MySQLは残り一つですが、この二つのデータベースを作る事は可能なのでしょうか?二つ必要ですか? □スマホのサイトも作成しているんですが、PCサイトと同様にデータベースに接続し、一覧表示できるのでしょうか? スマホでPHPが使えるのかなと思ったので。 ご存知の方いらっしゃいましたらご教示ください。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • データベースへの日本語入力

    PHPとMySqlを勉強し始めたものです。 超初心者ですが、よろしくお願いします。 @PAGES(http://atpages.jp/)というサイトを使っています。 ネットで見つけたサンプルプログラムを使って、データベース(MySql)へのデータの入力と読み出しをやってみたのですが、半角英数字なら、読み込みや書き出しはできるのですが、日本語の文字であれば、空白になってしまいます。 プログラムを調べてみると、PHPでのデータベースへの書き込みのときは、ちゃんと日本語の文字を書き出そうとしているようなのですが、「phpMyAdmin」というサイトで書き込まれた情報を見てみると、空白なので、データベース側がデータの受け取りを拒絶したようにも思われます。 サイトで検索して、HTMLの<HEAD></HEAD>のところに下記のような行を入れたり、 <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> 『mysql_query("SET NAMES 'utf8'"); 』という行をデータの書き込み行の前に入れたりしても、変わりませんでした。 どのようにすれば、日本語もデータベースで扱えるようになるのか教えてください。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • データベースの更新

    複数のリスト間をドラッグ&ドロップで要素の入れ替えを行った直後に、データベースのフィールドの値(AID)を変更したいと考えています。 以下が今打ってるプログラムですが、実行すると「オブジェクトでサポートされてないプロパティまたはメソッドです」と出てしまいます。 PHP初心者でなかなか上手くいかずに悩んでいます。 ご意見よろしくお願いします。 【PHP文】 <?php session_start(); $db=mysql_connect("localhost","root","") or die ("接続できません"); mysql_select_db("ajax") or die ("database接続失敗"); mysql_query("SET NAMES utf8") or die ("クエリ発行できません"); $dd=mysql_select_db('ajax',$db); function s_1() { $query = "update A set AID = 1"; $result = mysql_query($query,$dd); } function s_2() { $query = "update A set AID = 3"; $result = mysql_query($query,$dd); } ?> 【ドラッグ&ドロップ制御文】 <script type="text/javascript" language="javascript"> Sortable.create('dd_1',{containment:['dd_2'],dropOnEmpty:true,constraint:false ,onUpdate:function(){s_1()}}); Sortable.create('dd_2',{containment:['dd_1'],dropOnEmpty:true,constraint:false ,onUpdate:function(){s_2()}}); </script>

    • 締切済み
    • PHP
  • MySQL/PHP に関する質問

    私は、MySQLとPHPを使って、情報検索サイト (Webアプリケーション)をつくりたいのですが、 MySQLおよびPHPのコマンド入力画面を立ち 上げるには、どのようにすればよろしいので しょうか? 私は、MySQL/PHPについてはまったくの 初心者で、何をどのようにすればよいのか、 さっぱりわかりません。 具体的な手順を教えていただけたら幸いです。 ---------------------------------------- レンタルサーバーは、paperboy&co.の「チカ ッパ!」を使用しています。 「チカッパ!」には、MySQL/PHP/phpMyAdmin がインストールされていて、 データベース名やID、パスワード等を、「チカ ッパ!」の管理画面で設定すれば、 MySQL/PHP/phpMyAdmin が使えるように なるのだと思いますが、 ID等を設定した後、次に具体的にどのように すれば、実際に使えるようになる(=コマンド 入力ができるようになる)のかが、わからない のです。 「チカッパ!」では、MySQL/PHP/phpMyAdmin の使い方のサポートはしないそうです。 以上、よろしくお願い致します。

  • フォームを使った送信が携帯からのみバグる

    送信フォームからMySQLへデータを受け渡し、データベースにある古いデータを更新するようなシステムをHTML+PHP+MySQLで作成しました。 PCからの操作では完璧に動作してくれたのですが、携帯端末(ボーダフォン904SH)からの操作ではバグってしまいます。 送信内容が文字化けし、書いてもいないHTMLやJavaScriptのソースコードが自動的に埋め込まれた状態で送信されているようです。 ちなみに、勝手に埋め込まれたHTMLのソースは何やら送信フォームのような記述、JavaScriptのソースはデータベース接続に関する記述のようです。 どなたか有識者の方いらっしゃいましたらご教示宜しくお願いします!