1

基本的に、私は何ヶ月も Web サイトに取り組んできましたが、それを開こうとしています。オープニングの前に、潜在的なセキュリティの問題について説明します。Web でいくつかの調査を行って、php の一般的なセキュリティの問題を見つけました。実際には問題がありますが、それらのほとんどを修正する方法はすでに知っていました。そのうちの 1 つ: の使用を避けたいです。include($_GET['page'])いくつかの調査を行いましたが、実際に使用するのに便利なものは見つかりませんでしたが、コードをそのまま「保護」する方法はありますか?
セキュリティ上の問題を防ぐためにコーディングしたものは次のとおりです。

if (!isset($_GET['page'])) 
{
echo redirect_tempo(500, 'index.php?page=home');    
}
    elseif ($_GET['page']=="index") 
    {
    echo redirect_tempo(500, 'index.php?page=home');        
    }
        elseif (file_exists($_GET['page'].".php"))
        {
        require $_GET['page'].'.php';
        }
            else 
            {
            echo redirect_tempo(500, 'index.php?page=404');
            }

基本redirect_temp()的には単なるheader().

これで十分ですか、それを改善できますか、それとも完全に変更する必要がありますか?

4

7 に答える 7

3

この部分は危険です:

elseif (file_exists($_GET['page'].".php"))

私はパスを与えることができます"../../../../etc/passwd"(私は知っています、それはちょっと古いですが、それは何でもかまいません)そして、それはファイルを読み取ります(十分な権限があれば)。

簡単な修正は次のとおりです。

elseif (file_exists(basename($_GET['page']) . ".php"))

actual にも同じことを適用することを忘れないでくださいrequire:

require basename($_GET['page']) . '.php';

basename()関数を 2 回適用する必要がないように、さらに上に適用することもできます。

以下も参照してください。basename

于 2013-03-03T08:30:55.020 に答える
0

ホワイトリストを使用します:

$all_pages = array(
    'index' => 'index.php',
    'about' => 'misc/about.php',
    '404' => '404.php',
    ...
);
function reverse($filename) {
    /* maps filenames to page names */
    return preg_replace('#/pages/(.*).php#', '$1', $filename);
}
/* add all php files in pages/ directory to $all_pages */
foreach (glob("pages/*.php") as $filename) {
    $all_pages[reverse($filename)] = $filename;
}

/* for debugging: make sure this only prints stuffs you want to include */
/* var_dump($all_pages); */

/* the actual check is simple */
$page_name = isset($_GET['page']) ? $_GET['page'] : "index";
$include_name = isset($all_pages[$page_name]) ? $all_pages[$page_name] : "404";
require $include_name;
于 2013-03-03T09:18:45.127 に答える
0

あなたの方法を実行しても問題はありません。基本的な検証を追加するだけで、悪意のあるユーザーが他のパスにアクセスしようとしないことがわかります。

スラッシュとドットが文字列に含まれていないことを検証することをお勧めします (Windows では ../ または / または \ のようなパスのため)。また、最後に .PHP をハードコーディングして、他のファイル タイプへのアクセスを防止することもできます。

if (strstr($_GET['page'], ".") || strstr($_GET['page'], "/") || strstr($_GET['page'], "\\")
{
    echo "error";
    exit;
}

include($_GET['page'] .".php");
于 2013-03-03T08:27:35.723 に答える
0

私のコメントで行くと、私はこのようなことをします。

switch($_GET['page']) {
    case 'index' :
        redirect_tempo(500, 'index.php?page=home');
    break;
    ........
    default :
        die('NO!');
    break;
}

ただし、これは最善の方法ではありません。

于 2013-03-03T08:29:52.150 に答える
0

あなたのコードはよさそうです。ただし、使用する前に GET 値も検証するとよいでしょう。数字のみか、アルファベットのみか英数字かを確認できます。単一の単語または複数の単語の場合があります。必要に応じてチェックしてください。

于 2013-03-03T08:32:02.390 に答える
0

これには許可されたすべてのページが含まれるため、$_GET['page'] == 検索には search.php が含まれますが、$_GET['page'] == 何かには home.php が含まれます :]

$allowed_pages = array('home', 'search', 'signup', 'signin', 'loggedin');
if(in_array($_GET["page"], $allowed_pages)) {
  $page = $_GET["page"]; 
} else { 
  $page = "home"; 
}
  $page = str_replace('/', '', $page);

if(file_exists("page_includes/$page.php")) {
  include("page_includes/$page.php");
} else {
  include("page_includes/home.php");
}
于 2013-03-03T08:43:51.600 に答える
0

これらの回答の多くは、ヌルバイト攻撃について忘れています。../../../../../etc/passwd などを防ぐために ".php" を追加すると、多くの展開では機能しません。この問題は、 PHP 5.3.4でのみ適切に修正されました。

于 2013-03-22T03:27:44.530 に答える