2012-04-22 11 views
4

以下のこのコードを使用してページネーションを制御しています。 $_SERVER['PHP_SELF']を使用していますので、この方法で安全かどうか、または何をしなければならないのですか?$_SERVER['PHP_SELF']は安全ですか?

<?php 

    if($rows > 10) { 
     echo '<a id=nex href="'.$_SERVER['PHP_SELF'].'?pg='.($startrow+10).'"> 
     Next</a>'; 
    } 

    $prev = $startrow - 10; 

    if ($prev >= 0) { 
     echo '<a id=pex href="'.$_SERVER['PHP_SELF'].'?pg='.$prev.'"> 
     Previous</a>'; 
    } 

?> 
+0

「* secure *」には多くの意味があります。あなたのものは何ですか? –

+0

"secure"は$ _SERVER ['PHP_SELF']が基本的にアドレスバーのwhatsを実行することを意味します。私はPHPを初めて使っていますが、$ _SERVER ['PHP_SELF']はサニタイズする必要があると言われました。 – ariel

+0

この場合、$ _SERVER ['PHP_SELF']をフォームアクションとして使用すると問題はありません。そして、それをチェックアウトして入力を受け入れるだけの愚かな場合にのみ。 –

答えて

7

のようなツールを使用しています。詳細は、this questionを参照してください。

href属性が?で始まり、パスがない場合、ブラウザーは、相対リンクが同じディレクトリーに追加されるように、後続の照会ストリングを現在の要求に追加することにも注意してください。

私はあなたが$prev$startrowを他の場所で消毒していると仮定しています。数学的比較はそれらを安全にするはずですが、$ _GETから来ている場合は、何かをする前にintval()まで実行することをお勧めします。

+0

ありがとうございます。これは、クエリの先頭にあるものです。//新しいスクリプトの開始 if(!isset($ _ GET ['pg'])または!is_numeric($ _ GET ['pg'])){ $ startrow = 0; } else { $ startrow =(int)mysql_real_escape_string($ _ GET ['pg']); } \t (int)を使用してエスケープするのは正しいですか? – ariel

+0

inval()で値を渡すか、(int)で整数にキャストすると同じ結果が得られます。 –

+0

psst:注入を防止するには、アクション属性を完全にリモートにします。デフォルトでは空の文字列になります。これは '$ _SERVER ['PHP_SELF']'が99.9%のケースでどのようなものかを表す相対URIです。 – hakre

0

$_SERVER['PHP_SELF']すでに何の文字は、あなたが投稿したいあなたのHTML構文に変化をもたらすことはできないという意味で安全です。唯一のことはファイル名そのものです。

通常、ブラウザに送信する前に出力を消毒するには、htmlspecialcharsのようなメソッドを使用する必要があります。

8

あなたはfilter_inputを使用する必要があります。http://php.net/filter_input

$phpSelf = filter_input(INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_URL); 

そして、代わりに$_SERVER['PHP_SELF']$phpSelfを使用しています。

あなたが$_SERVER['PHP_SELF']を逃れるためにhtmlspecialchars()またはfilter_input()を使用する必要があり、これがhtmlspecialcharsよりも良いですが、理想的なソリューションは、XSS攻撃を防ぐためにhttp://htmlpurifier.org/

+0

ありがとうございました。 PHPの初心者なので、filter_inputとhtmlspecialcharsの違いは何ですか?あなたは明確にすることができますか? – ariel

+0

htmlspecialcharsは、一部のHTMLシンボルをエンティティに変換するだけですが、ユーザーは引き続き外部文字またはUTF-8特殊文字を挿入できます。 filter_input with FILTER_SANITIZE_URLはURLリンクを検証します(PHPマニュアルではさらに多くのサニタイザーのタイプを見ることができます)が、これも不完全です(これを回避できる複雑なXSSテクニックがあります)。 HTMLPurifierは、XSSを回避し、これらの問題を他の機能で回避するために書かれているため、さらに優れています。 – alganet

+0

okですが、htmlspecialchars();ユーザー入力を表示するためにはまだ正しく動作しますか? – ariel

関連する問題