• ベストアンサー

pg_escape_stringをする意味

がわかりません $msg=$_POST['msg']; $msg=pg_escape_string(htmlspecialchars($msg)); としてフォームから送られてきたデータをpg_escape_stringして データをデータベースに入れたりしますが どうしてそうしなければならないのでしょうか? 具体的にmsgがどんなデータのときにそうしないと困るのでしょうか? 単に echo $msg; するときには必要ないのでしょうか?

  • guuman
  • お礼率86% (1043/1206)
  • PHP
  • 回答数3
  • ありがとう数9

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

DBにsqlを流すときに、生のデータを投げると 巧妙に細工されたデータにより、DBのデータが 消されてしまったり、情報が漏洩してしまったり する場合が考えられます。 また、そんなに深刻ではなくても、エラーになって しまったりするとかっこわるいので、エスケープして 明示的な文字列としてしようすることが多いです。 一言でいうと、 「クライアントから送られてくるPOSTやGETデータは、 まったく信用してはいけない」ということで、 基本的にはすべての引数に対して、どのような データが入っていてもエラーにならないような 工夫が必要です。

guuman
質問者

お礼

ありがとうございます 投稿データにデータベースをアクセスされるということですね

その他の回答 (2)

  • tomy06
  • ベストアンサー率25% (58/224)
回答No.3

POSTするデータにSQLを埋め込まれる可能性があるからです 詳しくは参考URLを見てください

参考URL:
http://www.hotfix.jp/archives/word/2004/word04-15.html
guuman
質問者

お礼

ありがとうございます エスケープされた文字列を見るにはどうしたいいのでしょうか?

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 データベースに入れる際に問題の起きる文字列を加工してくれてます。 例えば\マークや'(シングルクォーテーション)等 単純に表示するだけなら行わなくてもよいと思います。

guuman
質問者

お礼

ありがとうございます 表示するだけならば何もすることはないのですね

関連するQ&A

  • pg_escape_stringとhtmlspecialcharsの記述の仕方について

    お世話になります。フォームで入力した値をpostでPHPに送ってます。 その際にセキュリティを考えてpg_escape_stringとhtmlspecialchars関数を使用したいのですが、簡単な記述方法が分かりません。 今現在は下記のようにしてます。 $tesuto=pg_escape_string(@$_POST["tesuto"]); $tesuto="'" .htmlspecialchars($tesuto) ."'"; フォームで入力する項目が20箇所あるので、これをスマートに 記述する方法は無いでしょうか?よろしくお願いします。

    • ベストアンサー
    • PHP
  • mysql_real_escape_stringについて\r\nが付くのは?

    $sql = INSERT INTO users (logid, passwd) VALUES ( "'" . mysql_real_escape_string($_POST['id']) "','" . mysql_real_escape_string($_POST['pas']) . "';" とすると全POSTデータの先頭に「\r\n」が付与されてしまいます。 INSERT INTO users (iogid, passwd) VALUES ('\r\n 入力されたID', '\r\n 入力されたパス') こんな感じになってしまいます。 SQL実行時にデータベースに入ってしまっているのか、 phpMyAdminで確認すると、文章内に改行が入ってしまっているみたいで、表のレイアウトがガタガタになっています。 SQLインジェクション対策に必要だと参考書には表記されているのですが、あまりにデータベースが見にくいので、私の使い方が間違っている様な気がします。 (1)\r\nが先頭に付与されるのは正しいのでしょうか? (2)データベースにSQLで\r\nをINSERTしると、データも\r\nが入ってしまうのでしょうか? (3)PHP + MySQLでSQLインジェクション関数はmysql_real_escape_stringだけなのでしょうか? なにぶん超初心者なので、ご教授の程よろしくお願いいたします。

    • ベストアンサー
    • 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
  • 関数htmlspecialcharsと関数sqlite_escape_stringの扱い方

    いつもお世話になっております。 環境:PHP5/SQLite3 関数 htmlspecialchars 関数 sqlite_escape_string サイトのセキュリティを考慮し、 上記2関数をなんとなく利用しているのですが、 この「なんとなく」を卒業したいと思っています。 アドバイスして頂きたい内容を書きますと、下記のようになります。 ---------------------------------------- 上記の2関数のうまい使い分けと言いますか、 「こういう時にはこっち!ああいう時には、あっち! んでもって、 これこれこういう時には、どっちも使え!」 ---------------------------------------- というようなアドバイスを期待しております。 DBのクエリ文に使用しないような場合でも、 sqlite_escape_string関数で浄化しておいて損はないように思うのですが、 そういう使い方だと何か問題はありますでしょうか。 (無視できるような小さな問題であれば、気にしないつもりです。) 浄化能力を包含関係で考えると、 htmlspecialchars ⊂ sqlite_escape_string と私は考えていますが、違いますでしょうか。 それと、これらの関数の、 使うタイミングと使う際の注意事項 についても、あれこれお話し頂けると嬉しいです。 具体例(コードorシチュエーション)を示して頂けると助かります。 他にも、こんな関数でも浄化できます、 というようなアドバイスも大歓迎です。 と、とても抽象的な質問文になりましたが、、、 どなたか、「ワンポイントアドバイス」でも結構ですので、 どうか宜しくお願い致します。

    • 締切済み
    • PHP
  • mysql_real_escape_stringについて

    PHPとMYSQLで連携させ組んでおります。文字コードはutf-8で改行コードはLFです。 ざっくりですが流れとしてはフォームからユーザーが入力した値を mysql_real_escape_stringしデータ登録しているのですが改行文字に問題があります。 ※改行文字は\r\nでも\rでも最終的に\nになるように統一しております。 それを踏まえて単純に登録する値を静的に以下のように作成します。 $val1 = mysql_real_escape_string("あああ\nいいい''ううう"); $val2 = "あああ\nいいい''ううう"; phpmyadminからテーブルを開きエクスポートしSQLを確認すると $val1は(1, 'あああ\\nい\\''\\''いい')となり $val2は(2, 'あああ\nい''''いい')となっています。 これは当然の動きかとは思うのですが改行文字\nが\\nになるのを防げないものかと 悩んでいるのですがこれは無理でしょうか? mysql_real_escape_stringしない場合エスケープもされないのでそのままの状態なのですが データを登録する場合やselect文でWHERE句を用いる場合セキュリティ的に外すことも できないもの(かと思い込んでいる)でどうしていいかわからない状態です。 知識もあいまいなもので無理なものだとわかればすぐにでも諦めがつくのですが なにかいい方法があるのでは・・・と淡い期待を持っており質問させて頂きました。 宜しくお願い致します。

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

    php mysqlです。 $row = $stt->fetch(PDO::FETCH_ASSOC); したあと、 $rowに入っているデータに対して、 mysql_real_escape_string 関数をかましたあとのデータに変更するにはどうすればいいのでしょうか? よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • sqlite_escape_stringのアンエスケープ方法

    sqliteのエスケープ方法としてPHPマニュアルでは sqlite_escape_string() を利用することが望ましいと 記述されています。 実際にsqlite_escape_string() を使用してDBに格納するのは 問題ないのですが、データを取り出したときに エスケープされたままで出てきます。 アンエスケープする方法はどのようなものでしょうか? str_replace("'","''",取り出した文字列); とかではないですよね・・・。

    • ベストアンサー
    • PHP
  • PHPをSJISでやるのは不可能

    なのでしょうか? pg_escape_string(addslashes('この予')); pg_escape_string(stripslashes('この予')); pg_escape_string('この予'); echo 'この予'; はいずれもエラーになります ちなみに echo 'この予\'; はOKです 環境は XP+Apache2+PHP5+POSTGRESQL8 の最新版です PHPとアパッチはすべてSJISに設定してあります

    • ベストアンサー
    • PHP
  • XP+PHP+POSTGRES(SJIS)

    でPHPしてますが <?PHP $str=pg_escape_string('予算'); echo$str; ?> をすると 予\算 と表示されてしまいます これではPOSTGRESで日本語が使えません これに対処する方法はあるのでしょうか? pg_escape_string を使わなければ問題ないのですが これではデータベースを保護できません SJIS独自の問題でUTF-8やEUC-JPなど ほかのコードでは問題ないのでしょうか?

    • ベストアンサー
    • 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

専門家に質問してみよう