フォーラム等で,添付ファイルにシングルクオートを含むファイルをアップロードしようとすると,SQLのエラーが発生します.
addslashes()とstripslashes()が適切に用いられていないのではないでしょうか?
影響が大きいので拙速に対策を行なうことはできません.
既に対策済みの方がいらっしゃりましたらアドバイスお願いします.
ファイル名にシングルクオートを含んでいても,コースファイルへのアップロードは可能でした.つまり「送信」の機能の問題ではありません.
add_to_log()やmdl_forumへの登録の段階でエラーが発生していると予想されます.
moodledata中のmoddata/forumの中には,シングルクオートを含むファイル名のファイルがきちんとアップロードされていますね.やはりエラーメッセージにあるように,mod_forum_postsのattachmentのupdateの際にエラーが出ているだけだと思われます.
選択肢は二つ,mdl_forum_postsに添付ファイル名を記録する際にaddslashes()等をきちんと適用するか(自信が無い),あるいはフォーラムでアップロードするファイル名を勝手に修正するか,です.後者は楽な気がしますが,ユーザにとっては気持ちの良いものではありませんね.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '08.doc' WHERE id = '1897'' at line 1
UPDATE mdl_forum_posts SET attachment = 'network'08.doc' WHERE id = '1897'
line 1328 of lib\dmllib.php: call to debugging()
line 1254 of lib\dmllib.php: call to set_field_select()
line 3974 of mod\forum\lib.php: call to set_field()
line 528 of mod\forum\post.php: call to forum_add_new_post()
アップロード時に関係すると思われる箇所は,
mod/forum/lib.phpの以下2つの関数,
function forum_add_new_post()とfunction forum_update_post()
それぞれ,
if ($post->attachment = forum_add_attachment($post, 'attachment',$message)) {
set_field("forum_posts", "attachment", $post->attachment, "id", $post->id);
}
ここでフィールドをセットしている.かといってset_field()に手を出すと酷いことになる恐れがあるので,やはりこの入口の部分で何とかしないとダメですよね.さらにadd_to_log()のことも考えると...ちなみにadd_to_log()はmod/forum/post.phpの真ん中辺り(場所は正確に示すことができません).
function forum_add_new_post()を
if ($post->attachment = forum_add_attachment($post, 'attachment',$message)) {
// set_field("forum_posts", "attachment", $post->attachment, "id", $post->id);
set_field("forum_posts", "attachment", addslashes($post->attachment), "id", $post->id);
}
このようにaddslashes()でエスケープするように修正したところ,ファイルのアップロードは成功しました.でも,添付ファイル名をクリックしてダウンロードしようとしてNG,投稿を削除しようとしてもファイルが削除できなくてNGです.stripslashes()をそれぞれの該当箇所に適用しないと駄目そうですね.でも,それで解決とは言い難いのが心配なところです...
削除に関しては,ちょっと怪しいですが,成功しているようです.
シングルクオートを含むファイル名の添付ファイルをダウンロードできないのは,file.phpで呼ばれるget_file_arguments()が原因のようです.この関数でシングルクオートを取り除いてしまっているのかな?
ちなみにコースファイルとしてアップロードしたシングルクオートを含むファイル名のファイルも,ダウンロード,削除共にできません.
#オリジナルのMoodleでは,コースファイル等にアップロードするファイル名にシングルクオート,ダブルクオートは使用不可ですので,このような問題は発生しません.多分.fs_moodleで拡張した機能ですので,これは私に責任ありかな?
lib/moodlelib.phpのfunction clean_param()の,
case PARAM_PATH: // Strip all suspicious characters from file path
$param = str_replace('\\\'', '\'', $param);
$param = str_replace('\\"', '"', $param);
$param = str_replace('\\', '/', $param);
$param = ereg_replace(':cntrl:|[<>"`\|\':]', '', $param);
$param = ereg_replace('\.\.+', '', $param);
$param = ereg_replace('//+', '/', $param);
return ereg_replace('/(\./)+', '/', $param);
これですね.fs_moodleで,Windowsでは使用不可ではない文字は使用可能とする改良を有効にしている場合は,ここを緩めないと,ファイル操作ができないですね.