0

ユーザーが任意のサイトの URL を指定できるようにするこの非常に単純なスクリプトがあります。このスクリプトは、オブジェクト タグの "data" 属性の URL を置き換えて、HTML ページのオブジェクト内にユーザーが選択したサイトを表示します。

コードが表示されることに気付いたので、ユーザーがオブジェクト内のサイトからページをロードできないように、入力を検証するにはどうすればよいですか。

コード:

 <?php
 $url = 'http://www.google.com';
 if (array_key_exists('_check', $_POST)) {
    $url = $_POST['url'];
 }
 //gets the title from the selected page
 $file = @ fopen(($url),"r") or die ("Can't read input stream");
 $text = fread($file,16384);
 if (preg_match('/<title>(.*?)<\/title>/is',$text,$found)) {
         $title = $found[1];
 } else {
         $title = "Untitled Document";
 }
 ?>

編集:(詳細)これはプロキシを意図したものではありません。どの Web サイトをオブジェクト タグにロードするかをユーザーが決定できるようにしています (iframe に似ています)。PHP が読み取る唯一のものは、入力 URL からのタイトル タグであるため、サイトのタイトルに読み込むことができます。(ユーザーをだまさないように心配しないでください) どんなサイトのタイトルも表示するかもしれませんが、それ以外の方法でフィルターをバイパスすることはありません。

また、私が行っていることに関連する脆弱性も認識しているため、検証を検討しています。

4

4 に答える 4

3

ガホアが言ったように、火遊びをしているので、ここでやっていることには細心の注意を払う必要があると思います。安全に行うことは可能ですが、ユーザーから提供された URL からのデータの取り扱いには十分注意してください。

ただし、あなたが抱えている特定の問題については、ファイル名の入力を取得した場合、たとえば誰かがボックスに「index.php」と入力した場合に発生すると思います。fopen がローカル ファイルを開く代わりにネットワーク メソッドを使用するように、URL が「http://」で始まることを確認するだけです。fopen 行の前に次のようなものがあります。

if (!preg_match('/^http:\/\//', $url))
    $url = 'http://'.$url;
于 2009-02-23T07:53:45.977 に答える
3

parse_url: http://us3.php.net/parse_url

スキームとホストを確認できます。

スキームが http の場合、ホストが Web サイトではないことを確認してください。ドット間の部分を取得するには、preg_match を使用することをお勧めします。www.google.com または google.com のように、preg_match を使用して google という単語を取得します。

ホストがIPの場合、その状況で何をしたいのかわかりません. デフォルトでは、preg マッチは真ん中の 2 つの数字とドットのみを取得します (.com の前にサイト名を取得するために preg_match を使用しようとすると)

于 2009-02-23T09:02:55.670 に答える
2

オープンな HTTP プロキシを作成していることに気付いていますか?これは非常に悪い考えです。

URL のコンテンツを取得する必要さえありますか? URL を提供して、ユーザーのブラウザにそれをさせてみませんか?

URL を取得する必要がある場合は、既知の URL の「ホワイトリスト」に対して検証することを検討してください。既知のリストに制限できない場合は、再びオープン プロキシに戻ります...

正規表現 (preg) を使用して適切な HTTP URL であることを確認してから、CURL 拡張機能を使用して実際の要求を実行します。

関数の fopen() ファミリとユーザー指定のパラメーターを混在させると、潜在的な災害のレシピになります。

于 2009-02-23T07:22:26.613 に答える
0

PHPフィルターを使用できます。

filter_var($url, FILTER_VALIDATE_URL) または filter_input(INPUT_POST, 'url', FILTER_VALIDATE_URL);

http://php.net/manual/en/function.filter-input.php

フィルターに関連するこの PHP wiki 投稿で参照されているこれらのドキュメントも試し てください

于 2017-05-24T21:54:36.477 に答える