2

私は自分のウェブサイト用の php コードを持っています。友人から、「 include 」メソッドを使用しているため、私のコードにはローカル ファイル インクルージョンの脆弱性があると言われました。

誰かがそれを修正するのを手伝ってくれますか、それとも私が助けを見つけることができる場所に私を導くことができますか? 私はそれを修正するいくつかの可能な方法を試しましたが、うまくいきませんでした。問題は、コードに言語ファイルを含めることです。

より明確にするために、以下のコードを次に示します。

<?php 

if(isSet($_GET['lang']))
$lang = $_GET['lang'];
else $lang='en';

include 'languages/'.$lang.'.php'; 
include("header.php");
?>

PS i には 2 つの言語ファイルしかなく、英語 = "en.php" とアラビア語 = "ar.php" です。

誰かが助けてくれれば本当にありがたいです。

4

2 に答える 2

2

ユーザー入力を決して信用しないでください!

<?php 

if ( isset($_GET['lang']) && $_GET['lang'] == 'en') {
    $lang = 'en';
} else {
    $lang = 'ar';
}

include 'languages/'.$lang.'.php'; 
include("header.php");

?>

または、可能な追加言語の準備として、次のようにします。

<?php 

$lang = !empty($_GET['lang']) ? $_GET['lang'] : 'en';

switch($lang) {
    default:
    case 'en':
        include 'languages/en.php'; 
        break;
    case 'ar':
        include 'languages/ar.php'; 
        break;
}

include("header.php");

?>

このようにして、後で言語を簡単に追加でき、必要なファイルのみが含まれていることを常に確認できます。

于 2016-05-19T09:30:33.457 に答える
1

脆弱性は、任意の種類の相対パスを で送信できること$langです。ユーザーがファイルをアップロードしてサーバー上の実際のパスを把握できる場合、これは特に危険です。

例:

  • ハッカーは、サイトのファイル アップロード機能を使用して をアップロードする可能性がありますevil.php/var/www/uploads/evil.phpハッカーは、ファイルが に保存されていること、アプリケーションが で実行されていることを知っている/発見した/推測している可能性があります/var/www/html
  • 通常、/var/www/uploadsHTTP 経由でアクセスできない場合、誰もこのファイルを実行できません。
  • しかし、それを開いhttp://example.com/index.php?lang=../../uploads/evilて推測することは可能であり、それは!languages/../../uploads/evil.phpに解決されるものを含みます。/var/www/uploads/evil.php

もちろん、通常はパスワードで保護されたディレクトリ (phpMyAdmin など) 内のファイルなど、アクセスして呼び出すことで何かを悪用するために使用できるファイルが他にある場合、これはファイルのアップロードなしでも機能します。

そして、「それはかなり多くの仮定であり、「可能性と可能性」が含まれている場合、これを成功させるには非常に幸運である必要がある」と考えている場合は、気をつけてください。たとえば、サーバーを乗っ取ったり、データベースを削除したりできますが、最も危険なのは、エクスプロイトを機能させるために複数のパズルのピースが必要なものです。サーバーが実際にハッキングされると、当然のことながら、より経験豊富なため、より危険な (おそらくステルス) ハッカーが玄関先にいることになります。誰かがセキュリティ ホールを見つけようと決心した場合 (その人があなたのサイトまたはあなたを攻撃するという実際の目標を持っているため、


複数の解決策があります。

u_mulder で提案されているように、ある場合はarenそれがどちらかであるかどうかを確認してください。

より多くの言語がある場合は、許可された値のリストを含む配列を作成し、送信された言語がその配列に含まれているかどうかを確認できます。次に例を示します。

$languages = ['de', 'en', 'ar', 'jp', 'fr'];
if(in_array($_GET['lang'], $languages)) {
    $selectedLanguage = $_GET['lang'];
} else {
    $selectedLanguage = 'en'; // default
    // Note that you could also show an error "invalid language" instead
}

フォルダーに存在するファイルのみを許可することでこれを制御したい場合は、言語に文字のみが含まれていることを検証することもできます (または、ドットやスラッシュなどが含まれていないことを確認する限り、必要なものは何でも)。 :

if(preg_match("/^[a-z]*$/", $_GET['lang'])) { ... }

このアプローチでは、指定されたファイルが存在するかどうかも必ず確認する必要があることに注意してください。そうしないと、無効な言語を指定して言語のないサイトを作成する可能性があります (特に、include存在しないファイルに対してエラーをスローしないため、require)。

于 2016-05-19T09:35:55.307 に答える