ホームページ  >  記事  >  バックエンド開発  >  PHP 言語開発における LDAP 関連の脆弱性を回避するにはどうすればよいですか?

PHP 言語開発における LDAP 関連の脆弱性を回避するにはどうすればよいですか?

王林
王林オリジナル
2023-06-10 21:18:061065ブラウズ

LDAP (Lightweight Directory Access Protocol) は、ディレクトリ サービスへのアクセスと管理に使用される一般的なネットワーク プロトコルです。 PHP 言語開発では、ID 認証やユーザー認可などの外部 LDAP ディレクトリ サービスと対話するために LDAP がよく使用されます。ただし、LDAP の性質上、LDAP インジェクションや LDAP オーバーライドの問題など、セキュリティ上の脆弱性もいくつかあります。この記事では、PHP 言語開発における LDAP 関連の脆弱性を回避する方法について説明します。

  1. LDAP インジェクションを回避する

LDAP インジェクションは、SQL インジェクションと同様、一般的なセキュリティ脆弱性です。攻撃者は、LDAP クエリ文字列を偽造することで認証とアクセス制御をバイパスし、未承認のディレクトリ データにアクセスすることができます。

LDAP インジェクションを回避するには、パラメータ化された LDAP クエリ ステートメントを使用する必要があります。具体的には、LDAP フィルターとパラメーター化された入力を使用して LDAP クエリを構築する必要があります。たとえば、次のコードは、単純な LDAP 認証クエリを示しています。

$ldap_dn = "cn=".$_POST['username'].",ou=people,dc=example,dc=com";
$ldap_password = $_POST['password'];

$ldap_con = ldap_connect("ldap.example.com");
ldap_bind($ldap_con, $ldap_dn, $ldap_password);

上記のコードには、$ldap_dn と $ldap_password という 2 つの変数が含まれています。 $ldap_dn は、ユーザーが入力したユーザー名から構築された LDAP クエリ文字列です。 $ldap_password は、ユーザーが入力したパスワードです。攻撃者は、悪意のあるユーザー名を作成して $ldap_dn を偽造し、認証をバイパスしようとする可能性があります。たとえば、攻撃者が「admin)(&(password=」というユーザー名を作成した場合、上記のコードは「cn=admin)(&(password=,ou=people,dc」のようなクエリを実行します。 = example,dc=com" LDAP 文字列であるため、未承認のディレクトリ データにアクセスする可能性があります。

LDAP インジェクションを回避するには、パラメータ化された入力を使用して LDAP クエリ文字列を構築する必要があります。具体的には、ldap_escape() 関数を使用して、ユーザー入力をエスケープします。次のコードは、ldap_escape() 関数を使用した LDAP 認証クエリを示しています:

$username = $_POST['username'];
$password = $_POST['password'];

$ldap_dn = "cn=".ldap_escape($username, "", LDAP_ESCAPE_FILTER).",ou=people,dc=example,dc=com";
$ldap_password = $password;

$ldap_con = ldap_connect("ldap.example.com");
ldap_bind($ldap_con, $ldap_dn, $ldap_password);

上記のコードでは、ldap_escape() 関数を使用して $username をエスケープし、これは $username のビルドに使用されます。 ldap_dn。これにより、$ldap_dn には正当な LDAP 文字のみが含まれるようになり、攻撃者が悪意のあるユーザー名を作成して $ldap_dn を偽造することを防ぎます。

  1. LDAP 上書きの回避

LDAP 上書きこれは、攻撃者がディレクトリ内のデータを変更または削除できるもう 1 つの一般的なセキュリティ脆弱性です。たとえば、Web アプリケーションがユーザー情報の保存に LDAP を使用しており、適切なアクセス制御がない場合、攻撃者はユーザー データを変更または削除できます。 LDAP オーバーライド経由。

LDAP オーバーライドを回避するには、「非管理者」アカウントを使用して LDAP に接続する必要があります。具体的には、LDAP アカウントに対する読み取り専用のアクセス許可を作成し、それを LDAP 接続に使用する必要があります。これにより、Web アプリケーションにディレクトリ データを変更または削除するための十分なアクセス許可がないことが保証され、LDAP 上書き攻撃が防止されます。

さらに、LDAP を保護するには、セキュア バインド オプションを使用する必要があります。セキュア バインド オプションにより、LDAP 接続の安全性が保証され、攻撃者が LDAP 接続を中間攻撃してデータを改ざんしたり盗んだりすることが防止されます。

次のコードは、「非管理者」アカウントの使用方法と、 LDAP に接続するためのセキュア バインド オプション:

$ldap_username = "readonly_user";
$ldap_password = "password";

$ldap_con = ldap_connect("ldap.example.com");
ldap_set_option($ldap_con, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_start_tls($ldap_con);
ldap_bind($ldap_con, $ldap_username, $ldap_password);

上記のコードでは、$ldap_username と $ldap_password を読み取り専用権限を持つ LDAP アカウントの資格情報に設定し、次に ldap_start_tls () 関数を使用してセキュアなバインド オプションを有効にします。バインディング オプションを使用し、LDAP 認証に ldap_bind() 関数を使用します。

つまり、LDAP は強力で柔軟なプロトコルですが、セキュリティ上の脆弱性もいくつかあります。PHP 言語で開発するには LDAP 関連を効果的に回避するには脆弱性を解決するには、パラメータ化された入力を使用して LDAP クエリ ステートメントを構築し、「非管理者」アカウントのみを使用して LDAP に接続し、セキュア バインド オプションを使用して LDAP 接続を保護する必要があります。これらのベスト プラクティスにより、アプリケーションのセキュリティが効果的に強化され、それによってディレクトリ データが保護されます。そしてユーザーのプライバシー。

以上がPHP 言語開発における LDAP 関連の脆弱性を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。