ファイル管理で削除ができません

質問全般・改善要望
ichiun
メンバー
メンバー
記事: 1
登録日時: 2017年3月14日(火) 19:43

ファイル管理で削除ができません

投稿記事by ichiun » 2017年3月14日(火) 20:08

はじめまして。
掲題のとおり、[エレメント]>[ファイル管理]での削除機能が動かず困っています。

アップロードは正常にできますが、そのアップしたファイルの削除もできない状態です。
画像ファイル等の削除を実行しても「/hoge/piyo.jpg」の削除:失敗 と表示されてしまいます。

サーバーはさくらインターネットのスタンダードを利用しており、以下の環境です。

 Apache/2.2.31
 MODXのバージョン: 1.0.19J
 PHPのバージョン: 5.6.30
 セーフモード: off
 MySQLのバージョン: 5.5.38-log

原因・解決策などご存知の方がいらっしゃいましたら、ご教示頂ければ幸いです。
どうぞよろしくお願いいたします。
アバター
yama
管理人
記事: 2957
登録日時: 2009年7月29日(水) 02:50

ファイル管理で削除ができません

投稿記事by yama » 2017年3月15日(水) 13:18

了解です、後ほど調べてみます
yutamp
メンバー
メンバー
記事: 1
登録日時: 2017年10月30日(月) 22:09

ファイル管理で削除ができません

投稿記事by yutamp » 2017年10月30日(月) 22:24

詳しく見ていないですが、checkToken()の処理がどうもうまく動いていないかも。
./manager/includes/extenders/ex_managerapi.php
にあるFunction checkToken()の返り値を常にTrueにすれば削除できるかと。当然ながらCSRFに対して脆弱になります。

それでも削除できない時はファイル名に2バイト文字を使うのをやめる。
a href="javascript:deleteFile('%E6%97%A5%E6%9C%AC%E8%AA%9E.pdf');"
って感じで削除対象のファイル名を渡しているんだけど、これだとブラウザが勝手にURLデコードしちゃう。さらにIEだと正しくデコードしてくれないので削除に失敗する。
mod_kks
メンバー
メンバー
記事: 22
登録日時: 2017年11月04日(土) 01:31

ファイル管理で削除ができません

投稿記事by mod_kks » 2017年11月04日(土) 02:23

checkTokenの挙動自体はおそらく正常です。
ただ、ファイル管理におけるファイル削除ではcheckTokenが2度呼ばれており、1度目の戻し直前で「$_SESSION['token']」の値をリセットしているため、2度目はトークンが合わずfalseが返されるのが原因のようです。アップロード動作に関してはfiles.dynamic.phpを見る限り、URL遷移なしで動作しているのに対し、削除動作はフレームの中でwindow.location.hrefによってURL遷移しているので、このあたりが2度呼ばれてしまう原因なのかもしれませんね。
アバター
yama
管理人
記事: 2957
登録日時: 2009年7月29日(水) 02:50

ファイル管理で削除ができません

投稿記事by yama » 2017年11月08日(水) 09:16

checkToken()が2度呼ばれるのは、$_POST['token']か$_GET['token']のどちらかが渡ってきた時にコアが自動的にcheckToken()を実行するように仕様を改めたからだと思います。なのでfiles.dynamic.phpの中でcheckToken()を実行しなくてもセキュリティチェックが行なわれるため、該当する記述を全て削除すればよいと思います。後ほど修正します。
isoppa
メンバー
メンバー
記事: 11
登録日時: 2017年9月04日(月) 19:38

ファイル管理で削除ができません

投稿記事by isoppa » 2018年6月08日(金) 11:05

横から申し訳ありません。

同様の症状で困っております。
動作環境は、以下の通りです。
 Apache : 2.2.15
 PHPのバージョン : 5.3.3
 セーフモード : off
 MySQLのバージョン : 5.1.73
 MODXのバージョン : 1.0.19J

現状のバージョンで問題の箇所のみ修正して運用できればと考えておりますが、MODXを1.0.20Jにアップデートすることが解決策となるのでしょうか。

よろしくお願い致します。
mod_kks
メンバー
メンバー
記事: 22
登録日時: 2017年11月04日(土) 01:31

ファイル管理で削除ができません

投稿記事by mod_kks » 2018年6月09日(土) 16:21

viewtopic.php?f=32&t=1822

以前ファイル管理からのアップロード絡みで上記のような話があったのですが、
ファイルの削除だけ上手くいっていなかったと思います。
削除が上手くいかないのは、おそらく以前の話で出てきているtoken処理が関係しています。

/manager/actions/element/files.dynamic.php のdelete_file()内で以下のような記述があると思います。
if(!$token_check || !@unlink($file))

この$token_checkの値がfalseなため動作していないように見えます。
$token_checkの値を強制的にtrueにしたり、判別自体から$token_checkを外すと削除が上手くいくようです。
isoppa
メンバー
メンバー
記事: 11
登録日時: 2017年9月04日(月) 19:38

ファイル管理で削除ができません

投稿記事by isoppa » 2018年6月11日(月) 13:21

mod_kksさん

ご返信ありがとうございます。

/manager/actions/element/files.dynamic.php のdelete_file()内の
if(!$token_check || !@unlink($file))
上記の記述を
if(!@unlink($file))
のように修正することで、削除できるようになりました。
しばらく様子を見たいと思います。

あと、files.dynamic.phpですが、レポジトリを確認したところ、このスレッドのやりとりがなされていた11月以降更新等がなされていないよう思われますが、
この不具合は、最新版の1.0.20Jでも生じる不具合なのでしょうか?別の箇所の修正で改善等がなされているのでしょうか。
何か情報があればお教え頂けると幸いです。
mod_kks
メンバー
メンバー
記事: 22
登録日時: 2017年11月04日(土) 01:31

ファイル管理で削除ができません

投稿記事by mod_kks » 2018年6月11日(月) 15:57

file.dynamic.phpに関しては結局checkToken関連の削除修正が行われていないかもしれませんね。
master/developとも該当箇所はそのままになっているようです。
該当ファイルでセキュリティチェックは不要となったとのことですので、1.0.20Jでは以下3箇所を
変更すれば問題ないかと思います。

if(!$token_check || !@rrmdir($folder)) → if(!@rrmdir($folder))
if(!$token_check || !@unlink($file))   → if(!@unlink($file))
if(!$token_check) return false; → 削除

これと並行してJPEG拡張子問題でFileUpload.phpの修正が行われ、modx_move_uploaded_file
メソッドの移動云々でファイルブラウザが動作しなかったように記憶しています。
ファイルブラウザに関しては前投稿のトピックを参照していただければと思います。

ファイルブラウザもアップロードした画像などのパーミッションに問題があって、ファイルの削除
が上手く動作しなかったように思いますので、アップロードはファイル管理行った方が良いかと思います。
isoppa
メンバー
メンバー
記事: 11
登録日時: 2017年9月04日(月) 19:38

ファイル管理で削除ができません

投稿記事by isoppa » 2018年6月11日(月) 17:22

mod_kksさん
ご返信ありがとうございます。

if(!$token_check) return false; → 削除
この部分だけ、未修正ですので、修正しておきたいと思います。

ファイルアップロードに関する不具合についてもありがとうございます。
http://forum.modx.jp/viewtopic.php?f=32&t=1822のスレッドも参考に対応させていただこうと思います。