0

私は小さなプロジェクトに取り組んでいて、脳死状態になったので、ここの誰かが私のコーダーブロックを打ち負かすのを手伝ってくれることを願っています.

ページに渡される値 (存在する場合) に応じてコンテンツ表示を変更する php を使用してページを作成しようとしています (Locations)。さまざまな場所を保存したセーフリスト配列を作成しました。まず、渡された値をセーフ リストと照合してチェックし、一致する場合は 1 セットのコンテンツを表示します。

一致しない場合は、類似性テストを実行して、単純なタイプミスがあり、人々が望んでいたと思われるページに移動できるかどうかを確認していますが、ここで行き詰まっています。

誰かが入力できることを願っています

www.example.co.uk/location.php <---- 一般的な場所のページを読み込む

www.example.co.uk/location.php?loc=Bishops-Stortford <---- ターゲット ロケーション ページを読み込む

www.example.co.uk/location.php?loc=Bishop-Stortford <---- 90% 以上の一致を提供するスペルミスにもかかわらず、対象の場所のページを読み込む

www.example.co.uk/location.php?loc=?php echo "あなたのサイトをハッキングしました"; ?> ---- 私のシステムが厄介なコード インジェクションを無効にしてくれることを願っています

私が持っているものを見ることができるように、以下にコードを投稿します。

<?php 
        $loc = "";
        $safelist = array("Bishops Stortford", "Braintree", "Chelmsford", "Dunmow", "Harlow", "Hertford", "Saffron Walden", "Sawbridgeworth", "Stansted", "Ware", 
                    "Essex", "Hertfordshire");

        if(isset($_GET["loc"])) {
            /* Gets the value of loc if set, replaces hyphens with spaces and capitalises first letters of words converting the rest to lowercase. */
            $loc = ucwords(strtolower(str_replace("-", " ", $_GET["loc"])));
        }

        /* Is word in safelist */
        if (in_array($loc, $safelist)) {
            /* Yes */
            if (($loc == "Essex") or ($loc == "Hertfordshire")) {
                $county = True;
            } else {
                $county = False;
            }

            if ($county == False) {
                echo "\"" . $loc . "\" is not a county";
            }else{
                echo "\"" . $loc . "\" is a county";
            }
        } else {
            /* No, Is string 90% similar to any entry within the safelist? */
            foreach ($safelist as $safeword) {      
                similar_text($safeword, $loc, $percent); 
                echo $safeword . " " . $loc . " " . $percent . "<br />";

                if ($percent >= 90) {

            }
        }


    ?>

if ($percent >=90) に対して何をすべきかわかりません。ループを終了して、最初に見つけた 90% 以上の一致から結果を取得したいことはわかっていますが、これを行う方法が 100% 確実ではありません。

また、www.example.co.uk/location.php?loc=?php のようなコード インジェクションに対処する最善の方法は何ですか? echo "I hacked your site"; ?>

4

3 に答える 3

1

これがあなたが望むものだと思います:

       foreach ($safelist as $safeword) {      
           similar_text($safeword, $loc, $percent); 
           echo $safeword . " " . $loc . " " . $percent . "<br />";
           if ($percent >= 90) {
               $loc = $safeword;
               $county = true;
               break;
           }
       }

ユーザー入力を呼び出さない限り、eval()PHP ステートメントが挿入されることを心配する必要はありません。何かをエコーすると、それはブラウザーに送信され、PHP によって再度実行されることはありません。ただし、ユーザーのブラウザーをハイジャックする可能性のある HTML マークアップや Javascript が含まれている可能性があるため、出力をサニタイズする必要があります。ページに出力を表示するときは、次を使用htmlentities()してエンコードします。

echo "Greetings, " . htmlentities($first_name);
于 2013-07-05T17:39:55.977 に答える
0

私はそれを次のように再構築すると思います:

$loc = "";
$safelist = array("Bishops Stortford", "Braintree", "Chelmsford", "Dunmow", "Harlow", "Hertford", "Saffron Walden", "Sawbridgeworth", "Stansted", "Ware", 
                "Essex", "Hertfordshire");
if(isset($_GET["loc"])) {
    /* Gets the value of loc if set, replaces hyphens with spaces and capitalises first letters of words converting the rest to lowercase. */
    $loc = ucwords(strtolower(str_replace("-", " ", $_GET["loc"])));
}
$good = '';
if (in_array($loc, $safelist)) {
    $good = $loc;
} else {
    foreach ($safelist as $safeword) {      
        similar_text($safeword, $loc, $percent); 
        echo $safeword . " " . $loc . " " . $percent . "<br />";
        if ($percent >= 90) {
            $good = $safeword;
        }
    }
}
if ( ! empty($good)){
    /* Yes */
    if (($good == "Essex") or ($good == "Hertfordshire")) {
        $county = True;
    } else {
        $county = False;
    }

    if ($county == False) {
        echo "\"" . $good . "\" is not a county";
    }else{
        echo "\"" . $good . "\" is a county";
    }
    //And whatever else you want to do with the good location...
}

バーマーが言ったように、入力値を配列と比較する以外は何もしていないので、そのような攻撃のリスクはありません。

于 2013-07-05T17:44:00.740 に答える