• 締切済み

他ホストからのPOSTを防ぐ方法

php.iniのregister_globalsをOffにすることで不要な GETパラメータを受け付けないようにすることができますが、他ホストから、<form metho=POST acrion=http://***.com/xx.php> などとした場合、他ホストからPOSTできるわけで、 結局、他ホストからPOSTできないようにしないとrgister_globalsをOnにした時と、セキュリティーはあまり変わらないようか気がするのですが、 他ホストからPOSTできなくする方法はありますでしょうか? 現在、思いつくのはPHPに限らず以下の方法ですが、 いずれも完璧ではないような気がします。 1.refererチェック(100%で有効ではないらしい) 2.Sessionによる認証チェック(認証済みユーザなら結局、同一ブラウザを使い他ホストのページからPOSTできる)

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

みんなの回答

noname#3574
noname#3574
回答No.2

見返すと色々書き損じが・・ 補足させてください。 > register_globals の危険性は変数汚染にあります。 提示した URL 内に具体例があります。引用すると <?php $file = '/base/path/to/image/files/'.$name; header('Content-Type: image/gif'); readfile($file); ?> という PHP スクリプトに対して register_globals が on である場合、次のような URI を入力する事で GET メソッドを利用して汚染をかける事が出来てしまいます。 http://example.com/image.php?name=abc $_POST['name'] のように明確な意図の元に POST メソッドから値を取得する方法と比べ、通常の変数と変わらない $name に勝手にアサインされてしまう事が register_globals の何よりの問題なのです。 > 私に聞くよりググって PHP で経験を積みセキュリティに関して知識を蓄えた方の発言やドキュメントを調べる事をお勧めします。 は以下に訂正します。 私がここであれこれと書くよりは google で検索するなどして、経験と知識を蓄えた方の発言やドキュメントを調べた方が有効だと思います。 特に register_globals に関しては多方面から危険性が指摘されて変更になったことがあり、その指摘と、またその変更についての論議が PHP-users などのコミュニティに残っていて参考になると思います。 他のホストからの POST を防ぐ方法ですが、まず目的が、、セキュアなアプリケーションを作るという目的なら前投稿のような基本的な話になります。 とにかく他ホストからの POST を蹴りたいというなら ・基本認証 ・ページ間ごとにランダムな ID を生成しそれをキーとして信頼性を持たせる 等方法はあると思います。完璧を期するなら基本認証のような仕組みを使って信頼できるエリアを作る方法が使えると思いますが、、 「信頼出来る POST メソッドを保証する」というのはあまり見かけない案件です。目的に対してもっと適切で楽な方法があるかもしれません。 セキュアなwebアプリケーションの設計に関して IPA のドキュメントも参考になると思いますので提示しておきます。

参考URL:
http://www.ipa.go.jp/security/awareness/vendor/programming/index.html
noname#3574
noname#3574
回答No.1

register_globals の危険性は変数汚染にあります。 調べられると実例がごろごろ出てくると思います。 私に聞くよりググって PHP で経験を積みセキュリティに関して知識を蓄えた方の発言やドキュメントを調べる事をお勧めします。 PHP-users で参考になる発言があったので一例として挙げておきます。 また他のホストからの POST についてですが、完全に抑える術はありません。ベーシック認証なら可能かもしれませんが。 HTTP の構造上 web アプリケーションはページ単体で独立して設計されるべきだと思います。 つまり他のホストや認証されたページからの POST メッセージを無条件に信頼せず、不正なコードを埋め込まれたとしてもそれが脆弱性につながらないように設計されるべきです。 と書くと「ではパスワードはどうするのだ、外部に信頼性を依存するしかないではないか」等ツッコミも予想出来るのですが、要点は利用する機能の仕組みを理解し、目的と危険性を認識してハンドリングするということです。 例えばセッションは最早webアプリケーションに欠かせない機能の一つですが、一方でセッションハイジャックの危険性を認識してリスクを抑える必要があります。 以前セッションIDをGETメッセージで渡していたために referer からセッションIDが漏洩しセッションハイジャックの危険性を指摘された企業がありましたが、こういう危険性を抑えるには基本的な理解とセキュリティ情報に対するアンテナを高く掲げる事です。

参考URL:
http://ns1.php.gr.jp/pipermail/php-users/2002-November/011850.html

関連するQ&A

  • php設定ファイルについて

    セキュリティ上よろしくないとは知りながら、register_globalsの設定をonに変えたいと思っています。 で、いろいろ調べたのですが、ユーザーレベルでこの設定を変えるにはphpファイルのあるディレクトリでphp.iniというファイルを置き、中身を「register_globals=on」にする方法と、.htaccessを置いて中身を「php_flag register_globals on」とする方法と2つあるようですが、この方法はどちらもどのサーバーでも有効な方法なのでしょうか。 .htaccessについては許可していないサーバーもあるようですので万能ではないようですが、許可されているかされていないかは別として、これらのファイルを置けば有効になるものなのか、それともサーバー管理者が「このファイルにこう書けばOK」と設定次第で有効になるものなのかが知りたいのです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • iphone5のみpostパラメータの消失

    お世話になっております。 iphone5であるページからブラウザの戻るボタンを押したときに POSTデータが消失している事象が発生してしまいました。 SESSION等を使えばいいのですが、 それをやる事で影響度と修正量も多くなるので避けたいところです。 またGETにしてもパラメータ量が多くなる事から避けたいです。 そこでREFERER見たいに遷移元のPOST値などを取得する方法をご存知であれば ご教授頂ければと思っております。

    • 締切済み
    • PHP
  • register_globalsがOFFの状態で処理をさせる方法

    今現在、register_globalsがデフォルトでOFFだ というのは知っていますが、 実際にONを前提に書いている人、私も含めて多いと思いますが、 どうやって代替させるのかを 具体的に書いているサイトを知っていましたら、 教えて下さい。 色々なサイトを見ても、問題点は書いているけど、 代替方法があまり書いていないので、 どうすればいいのかよく分からず、 OFFに切り替えたいけど、 出来ない状態でいます ($_POST["***"]等を使うのは見ますが)。 hiddenを使うのは推奨されないということでしょうか? 値の引き渡しをしないで、 どうやって処理させるのか、 リンクで直接パラメーターを書くのも推奨されないと いうことでしょうか? 例: http://www.***.jp/index.php?***=**&***=1 是非ともご回答をお待ちしています。

    • 締切済み
    • PHP
  • formから$_getでデータの表示が出来ない

    初心者です。 同じような質問が、有りましたが、php.iniのregister_globalsはonでした。 同じソースを、某レンタルサーバに転送すると、正常に動作します。 apacheかphpの設定がおかしいのでしょうか??? よろしくおねがいします。

    • 締切済み
    • PHP
  • oscommerce日本語版について

    こんにちは oscommerce日本語版を下記環境で インストールしたのですが、 「FATAL ERROR: register_globals is disabled in php.ini, please enable it!」 と出てしまい、管理画面にアクセスできません。 ほかのサイトで、/adminフォームの下に php_flag register_globals on の一文を書いた.htaccessを作ると 書いてあったので 試したのですが、解決しませんでした。 .htaccessが効いていないのでしょうか? 環境: php5 apache2 mysql4.1

    • 締切済み
    • PHP
  • if($mode == "insert"){ の書き方についてアドバイスをお願いします。

    FC4、php5とmysql4.1.20を入れて学習しています。 入力フォームに <form action="insert.php?mode=insert" method="POST"......と書き、 データ受取phpスクリプトに <? if($mode == "insert"){ $conn = mysql_connect("localhost","root","pass"); mysql_select_db("testDB","$conn"); $sql = "INSERT INTO SHOHIN (tanka,suu) values ('$tanka','$suu')"; ........... と書いたサンプルがあります。 ところが、入力フォームにデータをいれ、登録ボタンを押すと urlが、 http://localhost/***/insert.phpから http://localhost/***/insert.php?mode=insert に変わりますが、入力欄が白紙に戻ってデータ登録が出来ません。(そもそも、DBに接続が出来ません。) php.iniの register_globals = On にしても、状況は同じです。 コマンドライン上では、同じユーザ名パスワードでmysqlに順調に接続できデータ登録も出来ます。 試みに、php.iniの register_globals = Offで if($mode == "insert"){ を、if($_POST['$mode == insert']){ と変えてみましたが、解決出来ません。この書き方が拙いのでしょうか? 何かアドバイスを頂ければ有り難いです。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 携帯サイト用PHPのセッションについて

    はじめまして。 携帯サイトでPHPのセッションを使ってリンク先の【Location:】内にURL情報を埋め込みたいのですが、「携帯ではクッキーがつかえない」「【session.use_cookies】と【session.use_trans_sid】の設定で使えるようになる。」と見たので試しているのですがうまくいきません。助けてください。 今試してみている記述内容は下記となっています。 ・記述内容: >>test_a/1.php <?php ini_set("session.use_cookies","0"); ini_set("session.use_trans_sid","1"); session_start(); $_SESSION['test'] = "http://xxx.xx/test_a/"; header("Location:http://xxx.xx/test_b/2.php? .session_name().'='.session_id()."); exit; ?> >>test_b/2.php <?php ini_set("session.use_cookies","0"); ini_set("session.use_trans_sid","1"); session_start(); echo "セッションは" .$_SESSION['test']; ?> 試しに"echo"で表示させてみたところ、PCでは「セッションはhttp://xxx.xx/test_a/」と表示されるのですが、携帯(FOMA F904i)では「セッションは」しか表示されません。 どなたか、よろしくお願いします。

    • 締切済み
    • PHP
  • jqueryの$.ajaxでPHPに値を渡したい

    下記の様にjquery(ver1.4.x)の$.ajax関数を使って、 ajaxでPHPに値を渡したいと思っています。 ■Javascript (中略) $.ajax({ type:"POST", url:"test.php", data:{"check":check}, success:function(){ alert("OK"); } }); ■PHP(test.php) if ($_POST) { $_SESSION["data"][] = $_POST["check"]; } この時、普通の状態ならtest.phpで値が受け取れ、$_SESSION["data"]の配列内には$_POST["check"]の値が格納される事を確認しました。 しかし、ブラウザのCookieを無効(ブロック)に設定した場合のみ、$_SESSION["data"]の中には$_POST["check"]の値が入らないのです。 session_start();はJavascriptのあるHTML、test.php両方に書かれています。 クッキー無効の場合はJavascript(ajax)-PHP間でセッションは切断されてしまうのでしょうか? php.iniの設定では session_use_cookiesもsession_use_only_cookiesもOnになっています。 詳しい方おられましたらご教授宜しくお願いします。

    • ベストアンサー
    • PHP
  • php3からphpを呼び出し、POSTデータを渡す方法

    何時もお世話になります。 今回質問させて頂きたいことは php3のスクリプトからphpスクリプトを呼び出し、さらに phpスクリプトはPOSTデータを渡す方法は無いか教えて頂きたいです。 環境は FreeBSD4 apache_1.3.33 php-3.0.18-i18n-ja-3 php-4.3.7 です。 仮に呼び出し元のphp3のファイルをexample.php3 呼び出し先のphpのファイルをhoge.php として解説します。 example.php3から include、require等の関数で hoge.phpを呼び出した場合、hoge.phpは php3として実行される様なのでこの方法は×。 example.php3でvirtual()関数を使い、hoge.phpを呼び出せば 解決かと思ったのですがPOSTデータをhoge.phpに 渡す方法が無いためこの方法も×。 php3ではSESSIONが使えないため、SESSION + virtual()関数という 方法も×。 ということでちょっと手詰まりの状態です。どなたか解決方法をご存知の 方ご教示頂ければと思います。

    • ベストアンサー
    • PHP
  • $_POSTの使い方

    現在ログイン型情報サイトを運用しております。 ログインはPEARのAuthを使用しております。 ログイン認証やログイン判定後のページ表示やDB操作等について isset($_POST['hoge']) や if($_POST['hogehoge']) == xxxx) など 複数の場所でPOSTされた値を判定に使っております。 このサイトを丸ごとコピーして、アクセスした時点で既にログインしている状態を作らなければならなくなりました。 値をセッションに入れる時等、 $_SESSION['hoge'] = "yyyy"; のようにしますよね。 同様(かどうかわかりませんが・・・)に値があたかもPOSTされた状態を作る方法として if(!isset($_SESSION['username'])){ $_POST['username'] = "zzzz"; $_POST['password'] = "vvvv"; その他ログイン時にPOSTされる値を同様に$_POSR['aaaa']として書く } というコードを書いて、あたかもログインボタンを押してログインしたかのような状態を作る事はできたのですが、このような手法は上記状態を作るために行う手段としては正しいのでしょうか? またセキュリティ等、自分が気づかないような穴があるかどうか心配です。 手法としてやってもよい事なのか、よくない事なのか、気をつけなければいけないことが何かあるのか等、どなたかアドバイスをいただけないでしょうか?

    • 締切済み
    • PHP

専門家に質問してみよう