LOAD DATA
ステートメントはサーバ
ホストに置かれているファイルをロードできます。または
LOCAL
キーワードが指定された場合に、クライアント
ホストに位置するファイルをロードできます。
LOAD DATA
ステートメントのLOCAL
バージョンのサポートに関しては、潜在的な問題が
2 つあります。
ファイルの読み取りがサーバ側から開始される。そのため、理論的には、改悪した
MySQL
サーバを作成しておけば、クライアントがテーブルに対してクエリを実行した時に、クライアント
コンピュータ上に存在する全てのファイル
(カレントユーザが読み取り権を持つ)
を、LOAD DATA
ステートメントの改悪した MySQL
サーバが読み取れるということになります。
クライアントが Web サーバから接続する Web
環境では、ユーザは LOAD DATA
LOCAL
を使用して、Web サーバ
プロセスが読み取りアクセス権を持つどのファイルでも読み取ることができます。これは、ユーザが
SQL
サーバに対してすべてのコマンドを実行できる場合です。この環境では、MySQL
サーバに対するクライアントは実際には Web
サーバであり、Web
サーバに接続するユーザによるリモート
プログラムのことではありません。
この問題を解決するには、MySQL 3.23.49 と MySQL
4.0.2 (Windows では 4.0.13 ) 以降の LOAD DATA
LOCAL
の扱い方を変更しました。
デフォルトで、MySQL
クライアントとバイナリ配布のすべてを、--enable-local-infile
オプションでコンパイルしました。これは
MySQL 3.23.48 以前の MySQL
との互換性のためです。
MySQL
をソースから組み、--enable-local-infile
オプションで configure
を呼び出していない場合、mysql_options(...
MYSQL_OPT_LOCAL_INFILE, 0)
を明示的に呼び出すと指さなければ、クライアントは
LOAD DATA LOCAL
を使用できません。 項23.2.3.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 INFILE
を有効にする場合、サーバまたはクライアントのどちらかで、そのようなステートメントを発行しようとするクライアントは、次のようなエラー
メッセージを受け取ります。
ERROR 1148: The used command is not allowed with this MySQL version
MySQL Enterprise.
MySQL Network Monitoring and Advisory Service
では、サーバを --local-infile
オプションを有効にして起動する場合のセキュリティに関するアドバイスを提供しています。詳細は
http://www-jp.mysql.com/products/enterprise/advisors.html
を参照してください。