1

index.phpファイルといくつかの$_GET変数があるとしましょう。数百行のコードの後、変数をパラメータとしてメソッドを呼び出します。

すべての上に変数を検証する必要がありますか、それとも呼び出すクラス/メソッド内で変数を検証する必要がありますか?

2 つのことを念頭に置いてください。

  1. どこでも変数を複数回検証することを避ける..

  2. だけでなく複数のソースを持ち$_GET、異なるファイルからそのようなメソッドを複数呼び出す。

いくつかのコード:

<?php
function do_something($string) {
    // Validate $string here?
}

// ...or here, before using it?
$result = do_something($_GET['some_string']);
4

4 に答える 4

1

これは、標準的な解決策がありえない問題です。次のような「コントラクト」のようなものとして、index.php ファイルの最初の冒頭で呼び出されるヘルパー クラスを自分で作成できます (これはメンテナンスが少なく、柔軟性が最も高いソリューションであるため、これをお勧めします)。

<?
require_once "validator.php";

$validator = new Validator();
$validated = $validator->validateGet($_GET);

// all the remaining site's php code goes here

?>

このクラスは、すべての変数が正常かどうかを示すブール値や、タグが削除された値を含む配列など、必要なものを何でも返すことができます。

クロス サイト スクリプティングおよび/または SQL インジェクションに対するもう 1 つの障壁は、ステートメントを準備する必要があります 。 (ProductDAO) または ProductQuerier など、これも構造/保守上の理由によるものです。しかし、「最初の開始時または使用時に変数を検証する必要がある」という規則はありません。

于 2013-06-10T15:57:07.733 に答える
0

$_GETエントリーレベルで受け取っている最初の時点で検証して、後の段階でも以下のコードを確認してください-

// Validate $_GET['some_string'] HERE
$result = do_something($_GET['some_string']);

ここで検証すると -

function do_something($string) {
    // Validate $string here?
}

今度は検証がメソッドでのみ利用可能であるため、検証を見逃す可能性があり、コードに抜け穴が開く可能性があります。

データベースにいくつかの値を設定している場合は、データを再確認し、コード インジェクションから保護することをお勧めします。

于 2013-06-10T15:50:36.407 に答える
0

私はまだあなたの答えに満足していません.どのように検証するかを尋ねませんでした.どこでそれを行うかを尋ねました.

ここに私自身の提案があります:

PHP での手続き型コーディングの時代はついに終わったと思うので (!!)、index.php 内にロジックはありません。すべてのロジックはコントローラー クラスに入ります。

したがって、 dataSenderと data がありますReciever

としてReciever (PHP だけでなく、現実でも非常に一般的なことです)、 によって送信された情報を検証する必要がありSenderます。はReciever誰も信用しません (これは API などで重要です)。したがって、検証は、index.phpファイルの先頭やクラスの外側ではなく、作成したメソッド内にある必要があります。他の誰かがあなたのメソッドを使用していると想像してください。彼は引数を検証するつもりですか、それともあなたの仕事ですか? それはあなた次第だと思いますので、あなた(Reciever!)は を投げることができExceptionsます。$_GETまた、データ ( 、$_POST、...) をコントローラーの外でできるだけ生のままにしておくことも好きです。line に検証済みのデータを必要とするメソッドと、生データを必要とする100line のメソッドがあるとします。200今嘘をついている5生を消毒済みに変更しました。=> 2 つの変数 と を保持する必要が$dataあり$data_raw、これは不要なオーバーヘッドです。

考えてみてください

于 2013-06-10T18:13:11.183 に答える
0

ページの上部で、すべての変数を 1 行で検証できます

$_GET = array_map("mysqli_real_escape_string",$_GET);

Array_map は、配列のすべての値に 1 つの関数を適用します。この場合、mysqli_real_escape_stringを配列​​ $_GETに適用します。

重要:

これはサニタイズのみを目的としており、検証を目的としていないことに注意してください

すべての変数を独自に検証する必要があります。たとえば、整数で送信されている場合は、必ずintvalを使用して検証してください

詳細については、この質問を参照してください:サニタイズと検証

于 2013-06-10T15:51:26.853 に答える