LOAD DATA
ステートメントは、サーバーホストに配置されているファイルをロードしたり、LOCAL
キーワードが指定された場合に、クライアントホストに配置されているファイルをロードしたりできます。
LOAD DATA
ステートメントの LOCAL
バージョンのサポートに関しては、セキュリティーについての潜在的な問題が 2 つあります。
クライアントホストからサーバーホストへのファイルの送信は、MySQL サーバーによって開始されます。理論的には、パッチ適用済みサーバーを構築して、
LOAD DATA
ステートメントでクライアントによって指定されたファイルでなく、サーバーが選択するファイルを転送するようサーバーがクライアントプログラムに指示するようにすることができます。そのようなサーバーは、クライアントユーザーが読み取りアクセス権を持つクライアントホスト上のすべてのファイルにアクセスできます。クライアントが Web サーバーから接続する Web 環境で、ユーザーは
LOAD DATA LOCAL
を使用して、Web サーバープロセスが読み取りアクセス権を持つすべてのファイルを読み取ることができます (ユーザーが SQL Server に対してあらゆるコマンドを実行できる場合)。この環境では、MySQL サーバーを基準にしたときのクライアントは実際には Web サーバーであって、Web サーバーに接続するユーザーによって実行されているリモートプログラムではありません。
これらの問題に対処するために、MySQL 3.23.49 と MySQL 4.0.2 (Windows では 4.0.13) 以降で LOAD DATA LOCAL
の処理方法が変更されました。
デフォルトでは、バイナリ配布内のすべての MySQL クライアントおよびライブラリは
-DENABLED_LOCAL_INFILE=1
オプションでコンパイルされ、MySQL 3.23.48 以前との互換性が保持されています。MySQL をソースからビルドしたが、
-DENABLED_LOCAL_INFILE=1
オプションを指定して CMake を呼び出さない場合、LOAD DATA LOCAL
はmysql_options(... MYSQL_OPT_LOCAL_INFILE, 0)
を呼び出すように明示的に記述される場合を除いて、いずれのクライアントからも使用できません。セクション23.7.7.49「mysql_options()」を参照してください。--local-infile=0
オプションを指定して mysqld を起動することによって、サーバー側からのすべてのLOAD DATA LOCAL
ステートメントを無効にすることができます。mysql コマンド行クライアントの場合、
--local-infile[=1]
オプションを指定することによってLOAD DATA LOCAL
を有効にするか、--local-infile=0
オプションを指定することによってこれを無効にします。mysqlimport の場合、ローカルデータファイルのロードはデフォルトでオフになっており、--local
または-L
オプションを使用してこれを有効にします。いずれの場合でも、ローカルロード操作を正常に使用するには、サーバーがこの操作を許可していることが必要。-
オプションファイルから
[client]
グループを読み取る Perl スクリプトまたはその他のプログラムでLOAD DATA LOCAL
を使用する場合、local-infile=1
オプションをそのグループに追加できます。ただし、local-infile
を認識しないプログラムで問題が発生しないようにするために、loose-
プリフィクスを使用してこれを指定します。[client] loose-local-infile=1
-
サーバーまたはクライアントのいずれかで
LOAD DATA LOCAL
が無効な場合、そのようなステートメントを発行しようとしたクライアントは次のエラーメッセージを受け取ります。ERROR 1148: The used command is not allowed with this MySQL version