現在の位置: ホーム> 最新記事一覧> PHPでは、FTP_NB_GET関数を使用して暗号化されたFTPファイルを安全にダウンロードする方法は?

PHPでは、FTP_NB_GET関数を使用して暗号化されたFTPファイルを安全にダウンロードする方法は?

M66 2025-06-22

PHPでは、 FTP_NB_GETは、FTPサーバーノンブロッキングからファイルをダウンロードするための非常に便利な機能です。 FTP_GETのブロックとは異なり、 FTP_NB_GETを使用すると、ダウンロードプロセス中に他の操作を実行して、プログラムの応答性と効率を向上させることができます。ただし、暗号化されたFTPファイルに直面している場合、ファイルの整合性と機密性を安全にダウンロードして確認するには、追加の処理が必要です。

この記事では、PHPのFTP_NB_GET関数を使用して、暗号化されたFTPファイルの安全なダウンロードを実現する方法を詳細に紹介します。

  • FTP_NB_GETを使用した非ブロッキングダウンロードプロセス

  • SSL/TLSと組み合わせて、FTP伝送セキュリティを確保します

  • ダウンロードされたファイルを復号化します

  • データの改ざんやエラー処理を防ぎます


1。ブロッキング以外のダウンロードの紹介

FTP_NB_GETは、PHP FTP拡張機能の非ブロッキングダウンロード機能です。使用法は基本的に次のとおりです。

 <?php
$conn = ftp_connect("m66.net");
ftp_login($conn, "username", "password");

$local_file = "local_encrypted_file.dat";
$remote_file = "remote_encrypted_file.dat";

$ret = ftp_nb_get($conn, $local_file, $remote_file, FTP_BINARY);
while ($ret == FTP_MOREDATA) {
    // 他のことはここで行うことができます
    $ret = ftp_nb_continue($conn);
}

if ($ret == FTP_FINISHED) {
    echo "完成したダウンロード\n";
} else {
    echo "ダウンロードが失敗しました\n";
}

ftp_close($conn);
?>

上記のコードは、基本的な非ブロッキングダウンロードプロセスを示しています。重要なのは、 FTP_NB_CONTINUEが完了するまでダウンロードを続けることです。


2。FTP送信セキュリティ保証

通常のFTP送信は単純なテキストであり、ファイルはネットワーク上で簡単に傍受できます。暗号化されたFTPファイルを安全にダウンロードするには、転送自体が暗号化されていることを確認する必要があります。 2つの一般的な慣行:

1。FTPS(SSL/TLSでFTP)を使用します

PHPのFTP拡張はFTPSをサポートし、 FTP_Connectの代わりにFTP_SSL_Connectを使用できます。

 <?php
$conn = ftp_ssl_connect("m66.net"); // 合格 SSL 接続する FTP サーバ
ftp_login($conn, "username", "password");

// 残りの操作は上記と同じです
?>

このようにして、伝送プロセスは、中間の攻撃を避けるためにSSL/TLSによって暗号化されます。

2。SFTPを使用します

SFTPは、SSHに基づくファイル転送プロトコルであり、より安全です。ただし、PHPネイティブFTP拡張はSFTPをサポートせず、 SSH2拡張機能またはサードパーティライブラリの使用が必要です。ここでは拡張しません。


3。ダウンロードされたファイル復号化処理

サーバー上のファイルが暗号化されていると仮定すると(たとえば、AES対称暗号化を使用して)、対応するキーを使用してダウンロード後に復号化する必要があります。この例では、OpenSSLを使用します。

 <?php
$encrypted_file = "local_encrypted_file.dat";
$decrypted_file = "local_decrypted_file.dat";
$key = "your-secret-key-123";  // 対称キー
$iv = "your-16byteivvector";   // 初期ベクトル

$encrypted_data = file_get_contents($encrypted_file);
$decrypted_data = openssl_decrypt($encrypted_data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);

if ($decrypted_data === false) {
    die("復号化に失敗しました");
}

file_put_contents($decrypted_file, $decrypted_data);
echo "ファイル復号化に正常に\n";
?>

知らせ:

  • キーとIVは暗号化と一致する必要があります

  • キー管理は安全である必要があり、プレーンテキストを保存することはできません


4。完了例:非ブロッキングセキュアダウンロードと復号化

<?php
$conn = ftp_ssl_connect("m66.net");
if (!$conn) {
    die("无法接続する到 FTP サーバ");
}

if (!ftp_login($conn, "username", "password")) {
    ftp_close($conn);
    die("ログインに失敗しました");
}

ftp_pasv($conn, true);  // パッシブモードを有効にします,ファイアウォール環境により適しています

$local_encrypted = "local_encrypted_file.dat";
$remote_encrypted = "remote_encrypted_file.dat";

$ret = ftp_nb_get($conn, $local_encrypted, $remote_encrypted, FTP_BINARY);
while ($ret == FTP_MOREDATA) {
    // ここでは、進行状況ディスプレイまたはその他のロジックを追加できます
    $ret = ftp_nb_continue($conn);
}

if ($ret != FTP_FINISHED) {
    ftp_close($conn);
    die("ダウンロードが失敗しました");
}

ftp_close($conn);
echo "完成したダウンロード,復号化を開始します...\n";

// パラメーターを復号化します
$key = "your-secret-key-123";
$iv = "your-16byteivvector";

$encrypted_data = file_get_contents($local_encrypted);
$decrypted_data = openssl_decrypt($encrypted_data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);

if ($decrypted_data === false) {
    die("復号化に失敗しました");
}

$local_decrypted = "local_decrypted_file.dat";
file_put_contents($local_decrypted, $decrypted_data);

echo "ファイルは正常に復号化され、保存されています $local_decrypted\n";
?>

5。概要と予防策

  • FTP_SSL_CONNECTを使用して、送信暗号化を確保し、中間攻撃を避ける

  • FTP_NB_GETを使用して、非ブロッキングダウンロードを実現して、効率とユーザーエクスペリエンスを向上させる

  • ダウンロードした後、OpenSSLを使用してファイルを復号化して、データの機密性を確保する

  • 漏れを避けるために、キーと初期ベクトルを適切に管理します

  • パッシブモード( FTP_PASV )を有効にして、ネットワーク環境の互換性の問題を解決します

これにより、PHPを使用して、暗号化されたFTPファイルを安全かつ安定してダウンロードおよび処理できます。