PHPでは、 FTP_NB_GETは、FTPサーバーノンブロッキングからファイルをダウンロードするための非常に便利な機能です。 FTP_GETのブロックとは異なり、 FTP_NB_GETを使用すると、ダウンロードプロセス中に他の操作を実行して、プログラムの応答性と効率を向上させることができます。ただし、暗号化されたFTPファイルに直面している場合、ファイルの整合性と機密性を安全にダウンロードして確認するには、追加の処理が必要です。
この記事では、PHPのFTP_NB_GET関数を使用して、暗号化されたFTPファイルの安全なダウンロードを実現する方法を詳細に紹介します。
FTP_NB_GETを使用した非ブロッキングダウンロードプロセス
SSL/TLSと組み合わせて、FTP伝送セキュリティを確保します
ダウンロードされたファイルを復号化します
データの改ざんやエラー処理を防ぎます
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が完了するまでダウンロードを続けることです。
通常のFTP送信は単純なテキストであり、ファイルはネットワーク上で簡単に傍受できます。暗号化されたFTPファイルを安全にダウンロードするには、転送自体が暗号化されていることを確認する必要があります。 2つの一般的な慣行:
PHPのFTP拡張はFTPSをサポートし、 FTP_Connectの代わりにFTP_SSL_Connectを使用できます。
<?php
$conn = ftp_ssl_connect("m66.net"); // 合格 SSL 接続する FTP サーバ
ftp_login($conn, "username", "password");
// 残りの操作は上記と同じです
?>
このようにして、伝送プロセスは、中間の攻撃を避けるためにSSL/TLSによって暗号化されます。
SFTPは、SSHに基づくファイル転送プロトコルであり、より安全です。ただし、PHPネイティブFTP拡張はSFTPをサポートせず、 SSH2拡張機能またはサードパーティライブラリの使用が必要です。ここでは拡張しません。
サーバー上のファイルが暗号化されていると仮定すると(たとえば、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は暗号化と一致する必要があります
キー管理は安全である必要があり、プレーンテキストを保存することはできません
<?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";
?>
FTP_SSL_CONNECTを使用して、送信暗号化を確保し、中間攻撃を避ける
FTP_NB_GETを使用して、非ブロッキングダウンロードを実現して、効率とユーザーエクスペリエンスを向上させる
ダウンロードした後、OpenSSLを使用してファイルを復号化して、データの機密性を確保する
漏れを避けるために、キーと初期ベクトルを適切に管理します
パッシブモード( FTP_PASV )を有効にして、ネットワーク環境の互換性の問題を解決します
これにより、PHPを使用して、暗号化されたFTPファイルを安全かつ安定してダウンロードおよび処理できます。