• ベストアンサー

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

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

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

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

  • ベストアンサー
  • myaa_myu
  • ベストアンサー率52% (9/17)
回答No.1

ループでまわせば、POSTの値はすべて変換されるのではないでしょうか。 $tesuto = array(); // 変換後のデータを入れる配列 foreach( $_POST as $key => $value ){ $tesuto[$key] = pg_escape_string($value); $tesuto[$key] = "'" .htmlspecialchars($tesuto[$key]) ."'"; } これで、pg_escape_string及びhtmlspecialcharsしたデータが、$tesuto[キー名]に保存されます。 (試してないので、文法エラー等でたらごめんなさい;)

kurateru
質問者

お礼

ありがとうございます。出来ました。またよろしくお願いします。

その他の回答 (1)

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

セキュリティをかんがえているならPOSTのデータを何の制限もなく 受け取ってはいけませんね。 受け取るキーのリストを作っておいてそれをもとに変数に代入すれば よいでしょう。 こんな感じでしょうか? <?PHP $allowPostkey=Array("a","b"); //POSTのaとbだけ受け取るための配列 foreach($allowPostkey as $val){ $data=&$$val; $data=$_POST[$val]; $data=pg_escape_string($data); $data="'" .htmlspecialchars($data) ."'"; } print "aは{$a}<br>"; print "bは{$b}<br>"; print "cは{$c}<br>"; print<<<eof <form action={$_SERVER["PHP_SELF"]} method=post> <input type=input name=a value="<a a a>"><br> <input type=input name=b value="&amp;"><br> <input type=input name=c value="<c>"><br> <input type=submit value="送信"> </form> eof; ?>

kurateru
質問者

お礼

ありがとうございます。受け取るデータが決まっている部分はご指摘のとおり、行いたいと思います。

関連するQ&A

  • pg_escape_stringをする意味

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

    • ベストアンサー
    • PHP
  • 関数htmlspecialcharsと関数sqlite_escape_stringの扱い方

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

    • 締切済み
    • PHP
  • PHPのhtmlspecialcharsについて

    PHPのhtmlspecialchars関数は、フォームがある箇所に使う関数ですか?htmlspecialchars関数を使う場面を教えていただけると幸いです。

    • ベストアンサー
    • 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
  • 「addslashes」と「htmlspecialchars」について

    「addslashes」と「htmlspecialchars」について、いくつか分からない点があるので、教えてください。 ■質問1. http://kezy.org/2009/10/04/php-get-post 関数化している例が掲載されているのですが、このやり方を真似してもよいものでしょうか? http://kmaebashi.com/zakki/zakki0042.html ここでは、それぞれの処理の直前に行うべきと書かれていて、 また別のサイトでも、用途に沿った処理方法で、と書かれているのですが、 「addslashes」と「htmlspecialchars」を一つの関数にまとめることは、次のどれに当たるでしょうか? ・別に問題ない ・奨励はしないけど、間違いではない ・止めたほうがよい ※二つを関数化すると、便利だと思うのですが、必要ないところにもサニタイズ処理等がかかるのかな、と思い、そこら辺が問題ないかよく分からなかったので、質問しました。 ■質問2.MySQLを利用する場合は、「addslashes」より、「mysql_real_escape_string」を利用したほうがよいのでしょうか? 両者の違いは何でしょうか? ■質問3.プリペアド・ステートメントを使うのであれば、該当フォーム部分については、別にSQLインジェクション対策をしなくてもよいのでしょうか? あるいは、プリペアド・ステートメントを利用しても、あくまでも攻撃を受ける可能性が下がるだけ(?)なので、「addslashes」をしとくべきなのでしょうか? ※なんでもかんでもやればいいってものでもないのかな? と思い、質問しました。

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

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

    • ベストアンサー
    • PHP
  • htmlspecialcharsについて

    フォームから送られてきたデータの中に「<」や「>」が含まれていたら htmlspecialcharsを使用してを変換したいのですが、変換されず その原因もわからない状態でおります。 $text=$_POST['text']; $text= htmlspecialchars($text); print"text=$text"; としています。 フォームから「"」を入力すると「\"」と変換されます。 PHPマニュアルなど見ますと「<」は「&lt;」に変換され表示される のでは思っているのですが。 また、preg_replace も試しましたが変換されませんでした。 PHP Version 4.3.10です。 どなたかご教授いただけないでしょうか。お願いします。

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

    php mysqlです。 $row = $stt->fetch(PDO::FETCH_ASSOC); したあと、 $rowに入っているデータに対して、 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

専門家に質問してみよう