html用とmysql用のエスケープ処理の両立方法

このQ&Aのポイント
  • html用とmysql用のエスケープ処理を両立する方法について
  • mysql_real_escape_stringを先に使用して、htmlspecialcharsを出力直前に使用する
  • 他には方法があるのかどうか
回答を見る
  • ベストアンサー

html用とmysql用のエスケープ処理の両立方法

一度htmlspecialcharsしたものをmysql_real_escape_stringしてはいけない、そうです。 下記のように$pageをブラウザに表示もして、mysqlでも使う場合はどうするのでしょうか。 先にmysql_real_escape_stringを使い終わった後に、 htmlspecialcharsを使うような構造になるように工夫するのでしょうか。 htmlspecialcharsは出力する直前に使用しなければならないですが、 mysql_real_escape_stringは直前でなくても構わないとのことなので そこも意識して・・・ $mysql = mysql_connect($HostName,$UserName,$Password); $page = mysql_real_escape_string($_GET['page']); $mysql_c = "SELECT * FROM tttttt WHERE page='$page'"; $mysql_q = mysql_query($mysql_c,$mysql); $page = htmlspecialchars($_GET['page']); $html = '<a href="?page='.$page.'">'.$page.'</a>'; <html> <body> <div><?php echo $page; ?></div> 他には方法がないのでしょうか。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

・「表示するときに」htmlspecialcharsを通す ・「MySQLに格納するときに」mysql_real_escape_stringを通す が基本です。 (e.g.) $page = $_GET['page']; if ($page == '') { $page ='0'; } $sql = sprintf("select * frm table where name='%s'", mysql_real_escape_string($page)); $html = '<a href="?page='. htmlspecialchars($name, ENT_QUOTES) .'">'.$page.'</a>';

kiseki777
質問者

お礼

ありがとうございます。 表示するとき・格納するときに使うの意味が良く分かりました。 このような使い方が一番いいのですね。試してみます。 ただ、 $html = '<a href="?page='. htmlspecialchars($name, ENT_QUOTES) .'">'.$page.'</a>'; は入力ミス??? $html = '<a href="?page='. htmlspecialchars($page, ENT_QUOTES) .'">'.htmlspecialchars($page, ENT_QUOTES).'</a>'; こういうことでしょうか? htmlspecialcharsを使ったあとにmysql_real_escape_stringを使う方法ですが、 $pageをmysql_real_escape_stringで通したものをhtmlspecialcharsで通す。 そのhtmlspecialcharsで通した後に再度$pageをmysql_real_escape_stringに通す場合、 例えば、元の$pageに変更を加えずに新たな変数に格納し直し、それに処理を加える。 $page_mysql = $page; $sql = sprintf("select * frm table where name='%s'", mysql_real_escape_string($page)); $page_html = $page; $html = '<a href="?page='. htmlspecialchars($page_html, ENT_QUOTES) .'">'.htmlspecialchars($page_html, ENT_QUOTES).'</a>'; $page_mysqlはmysqlに格納する直前にmysql_real_escape_stringして使い、 $page_htmlは表示する直前にhtmlspecialcharsして使い、 htmlspecialcharsを使った後に再度mysql_real_escape_stringを使う場合は $page_mysql2 = $page; $sql = sprintf("select * frm table where name='%s'", mysql_real_escape_string($page_mysql2)); と新たに専用の変数を作り直しmysql_real_escape_stringする というやり方はよろしくないでしょうか。

関連するQ&A

  • エスケープ処理

    どうも初めまして。 switch文を用いてページを振り分けてますが、 この場合$_GETはhtmlspecialcharsでエスケープ処理するべきでしょうか?それともSQL構文が入力されることも考えられるのでmysql_real_escape_string()も使うべきなのでしょうか? ああ混乱してます><; どなたか、よろしくお願いします if(isset($_GET['page'])){ $page = $_GET['page']; }else{ $page = "home"; } switch ($page) { case 'home': require ("home.php"); break; ~同じようなのが複数~略 default: echo "ページが見つかりませんでした"; break; }

    • ベストアンサー
    • PHP
  • 括弧内の処理の順序

    プログラムを見ていて気になった点があります。 htmlspecialchars(mysql_real_escape_string(stripslashes($_POST["inp01"])),ENT_QUOTES) 上記の書き方の場合、処理される順番は 内から「stripslashes」→「mysql_real_escape_string」→「htmlspecialchars」になるんでしょうか? 逆に 外から「htmlspecialchars」→「mysql_real_escape_string」→「stripslashes」 でしょうか。 また処理の順番ですが、 「htmlspecialchars」→「stripslashes」→「mysql_real_escape_string」が正しい形でしょうか。

    • ベストアンサー
    • PHP
  • 【php】改行にエスケープ文字が入る

    phpで  $_GET['a'] = stripslashes($_GET['a']); $_GET['a'] = mysql_real_escape_string($_GET['a']); $_GET['a'] → インサート と途中に stripslashes mysql_real_escape_string をはさんでから GETやPOSTを取得してるんですが改行が改行コードに変わってしまいます。 例えば質問フォームとかで  ---------------------------------------- 質問内容 ---------------------------------------- なんたら かんたら  ↓ サブミット ---------------------------------------- 投稿確認 ---------------------------------------- なんたら\n\rかんたら みたいなかんじです。 一旦文字コードをEUCにかえてから mysql_real_escape_stringを挟んだりしたりもしてみてますが 改行が改行コードになってしまいます。

    • ベストアンサー
    • PHP
  • mysql_real_escape_string

    独学数ヶ月の初心者の質問で恐縮です。 もろもろの事情で仕方なくmysql_real_escape_stringを 以下(1)のように使用しなくてはならないと仮定し、 セキュリテイの面で(2)のようにシングルクオテーションつける 事で危険を回避できますか? またシングルクオテーションは(2)のようにつけてはいけない とかありますか?(記述の基本が曖昧なため、ただの確認の質問) (1) $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id", mysql_real_escape_string($id), mysql_real_escape_string($password)); (2) $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id", ’mysql_real_escape_string($id)’, ’mysql_real_escape_string($password)’); よろしくお願いします。

    • ベストアンサー
    • MySQL
  • PHP+ApacheでMySQLに接続できない。プロンプトからは可能

    以下のようなコードでmysqltest.phpというファイルを作成しました。 これを php -f mysqltest.php とやると成功します。 しかし、ブラウザでhttp://パス/mysqltext.phpとやると失敗します。 双方がどう違うのか教えていただけないでしょうか。 以下コードです。 ----------------------- <html> <body> <?php $hostname = "localhost:/var/lib/mysql/mysql.sock"; $name = "root"; $password = "pass"; printf( "hostname:%s<br>\n" , $hostname ); printf( "username:%s<br>\n" , $name ); printf( "password:%s<br>\n" , $password ); mysql_connect($hostname, $name, $password ) or die('cannot connect to database'); ?> </body> </html> ---------------------------------- 単に「ホスト:ポート」「ユーザネーム」「パスワード」を指定してconnectしているだけです。 コマンドラインから実行すると成功します ---------------------- <html> <body> hostname:localhost:/var/lib/mysql/mysql.sock<br> username:root<br> password:komaba<br> </body> </html> ---------------------------- ブラウザで実行すると失敗します。 ----------------------------- hostname:localhost:/var/lib/mysql/mysql.sock username:root password:pass cannot connect to database -----------------------------

  • mysql危険回避(1 OR effective)

    mysqlの危険回避の質問です。 (私がした1つ前に質問したものでは、解決しなかったので再度表現を変えて行います。) mysqlでwhere句の値に 1 OR effective=0 が入ると危険であり、シングルクオテーションで回避できる、とあるサイトでみました。 それを踏まえ、それまで以下の(1)で動いていたものを(2)にしたら、動かなくなりました。 そこで質問です。 (初めてphpに触れた人に教えるレベルで、かなり噛み砕いて教えていただけたら幸いです。) ■(1)はそのままでは危険という認識でよろしいですか? ■(2)はなぜ動かないのでしょうか? ■(1)を危険のない(もしくは可能な限り危険のない)書き方をするとしたらどうしたら いいでしょうか?(PDOで書く事!やmysqliがいい、というのは知っています。 どうしてもmysql_real_escape_stringを使わなくてはいけないという条件があったと 想定して強引にやるとしたらどうか、という事でお答えをいただければと思います。) (1) $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id", mysql_real_escape_string($id), mysql_real_escape_string($password)); (2) $id = "'" . mysql_real_escape_string($id) . "'"; $password = "'". mysql_real_escape_string($password) . "'"; $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id",$id , $password ); よろしくお願いします。

    • ベストアンサー
    • MySQL
  • array_mapを使ったエスケープ処理

    MYSQLとPHPでアプリケーション作成している初心者です。 今まで一つ一つの項目をmysql_real_escape_stringに通していたのですが今日、array_mapという関数がある事を知りました。 今まで自分がやっていたように項目毎に data1 = mysql_real_escape_string($_POST['data1']); data2 = mysql_real_escape_string($_POST['data2']); ...(省略) とするのは項目が増えれば増えただけ作業量も増えてしまうので $postdata = array_map("エスケープ関数",$_POST); としてPOSTされたデータは一括してエスケープ用関数を通そうかと思っています。 参考書などでこのような方法でエスケープ処理をしているのを見た事が無いの不安なのですが(googleで調べると結構やっている人がいました)、このやり方で何かデメリットはあるでしょうか?

    • ベストアンサー
    • PHP
  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • mysql_real_escape_string?

    mysql_real_escape_stringは、非推奨なのでしょうか? ▽PHP: mysql_real_escape_string - Manual   http://php.net/manual/ja/function.mysql-real-escape-string.php >この拡張モジュールを使うことはおすすめできません。 MySQLi あるいは PDO_MySQL を使うべきです この「拡張モジュール」って何を意味しているのでしょうか? 「mysql_real_escape_string」のことでしょうか? それとも、mysql_set_charset()などで、「デフォルトの文字セット」を設定しておけば、利用しても良いのでしょうか?

    • ベストアンサー
    • PHP
  • mysql_real_escape_string

    mysql_real_escape_stringについて調べていると、私と同じことを疑問に思い質問している人がいました。 こちらのページです。 http://okwave.jp/qa/q4423735.html mysql_real_escape_stringを通してDBに入れるとします。 すると、「テスト\」というデータをINSERTをするとDBには「テスト\」で入るのでしょうか? では、mysql_real_escape_stringを通さずにdbに入れても 「テスト\」というデータをINSERTをするとDBには「テスト\」で入ると思います。 上記のとおりとした場合、PHPはどうやってmysql_real_escape_stringを通したかどうか判定しているのでしょうか? 現在、mysql_real_escape_stringを通してDBに入れると、 「テスト\\」というデータがDBに入っています。 それをどうやって戻すのか調べていて、上記の質問を見つけました。 どうぞよろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう