2

私は PHP を初めて使用し、いくつかの _GET 変数を使用して、ページ レイアウト/Web サービス データ、およびページ上のその他のロジックを決定しています。データを保存したり、あらゆる種類のDBに書き込んだりしていません。これにはどのようなサニタイズを使用すればよいですか?

たとえば、私が使用している 1 つの変数は次のようなものです。

$querystring = $_SERVER['QUERY_STRING'];
if(isset($_GET['semester']) && $_GET['semester'] != ''){
  $listxml = simplexml_load_file("http://path/to/webservice/?".str_replace('semester','term',$querystring));

クエリ文字列に ?semester= が設定されていて空白ではない場合、それを「term」に置き換え、クエリ文字列をそのまま Web サービス URL に渡します (Web サービスは term 変数を使用しますが、term 変数は干渉します)。 wordpress を使用して、その「用語」(WP のタグ/カテゴリ) の投稿ページにリダイレクトするので、学期として WP を介して渡し、Web サービス呼び出しの用語に変更します。

したがって、この場合、Webサービスがクエリ文字列で行うことをそのままWebサービスに渡すことを除いて、_GETで何もしていませんが、何らかの方法でそれを「準備」する必要がありますか?

--

また、次のようなケースもあります。

$display = '';      
if (isset($_GET['display'])) {  
  $display = $_GET['display']; //set sort via querystring
} else {
  $display = 'interest'; //set to default by interest 
}

後で:

<div id='byalphabet' class='<?php global $display; if($display != 'alphabet'){echo 'hide';} ?>'>

<div id="byinterest" class="<?php global $display; if($display != 'interest'){echo 'hide';} ?>">

--

いくつかの動的な JavaScript にも使用します。

$view = '';
if (isset($_GET['view'])) { 
  $view = $_GET['view']; //set view via querystring
}

後で:

<script>
<?php if ($view != ''){ $view = str_replace('/','',$view); ?>
jQuery('#<?php echo $view; ?>').trigger('click'); //activate view option accordion pane 
jQuery('html,body').animate({'scrollTop':jQuery('#<?php echo $view; ?>').offset().top - 50},500); //scrollTo view
</script>

--

その他のケースには、配列で _GET 値を検索し、次array_search($_GET['major'], $slugs);を使用してページをリダイレクトすることが含まれます。

 $parts = explode('/',$_SERVER['REQUEST_URI']);
 Header( "HTTP/1.1 301 Moved Permanently" ); //SEO friendly redirect
 Header( "Location: http://www.site.ca/programs/outline/".$parts[3]."/" );

編集: ポップアップで提案された同様の質問の多くを読みましたが、それらは主に、DB への挿入など、他の方法でデータを使用することを指しています。

4

1 に答える 1

3

入力パラメーターは常にサニタイズする必要があります。データベースでそれらを使用していない場合でも、クロス サイト スクリプティング/XSS 攻撃に対して脆弱です。

<?php $view = $_GET['view'] ?>
<script>jQuery('#<?php echo $view; ?>').trigger('click');</script>

たとえば、上記のコードが与えられた場合?view=page_one、JavaScript が のように見えるため、すべて問題ありませんjQuery('#page_one').trigger('click');

しかし、クエリ文字列が次の場合はどうなるでしょうか。JavaScript は?view=hacked%27)%3B%20alert(document.cookies)%3B%20jQuery(%27%23page_oneページ上で次のようになります。

jQuery('#hacked'); alert(document.cookies); jQuery('#page_one').trigger('click');

これalert()は、認証トークンなどを別のサーバーに送信するための AJAX 要求と同じくらい簡単です。

最終的に行うサニタイズのタイプは、入力を使用しているコンテキストによって異なります。この例では、たとえば一重引用符を確実にエスケープしたい場合がありますが、適切なものは実装によって異なる場合があります。

入力のサニタイズに関する良い記事: http://coding.smashingmagazine.com/2011/01/11/keeping-web-users-safe-by-sanitizing-input-data/

于 2013-04-25T16:58:13.943 に答える