We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 28073
    • 164 Posts
    こんばんわです。
    少し気になることがあったので以下のソースをいじってもう一度ユーザ管理(webユーザじゃないほう)でユーザの追加や修正を行ってもらっていいですか?

    /manager/processors/save_user.processor.php 316行目付近
    $sql = "UPDATE $dbase.`" . $table_prefix . "user_attributes` SET
                            fullname='" . mysql_escape_string($fullname) . "',
                            role='$roleid',
    


    ↓真ん中の行を変更

    $sql = "UPDATE $dbase.`" . $table_prefix . "user_attributes` SET
                            fullname='" . $fullname . "',
                            role='$roleid',
    


    MEGUさんがユーザ管理で「ユーザ編集だと化ける」「ユーザ新規登録だと化けない」と言われてたのでちょっとソース追っかけてみました。
    それで違いと言えばこのmysql_escape_stringという関数が編集のときだけ2重にかかってたので、上記の修正ではそれを外してみてます。

    これでも文字化けが変わらなかったら…ちょっとお手上げかもです undecided
      • 33463
      • 35 Posts
      おはようございます。お疲れ様です。
      soushiさんの修正を適用してみたのですが変化無かったですね。
      一応ご報告まで。
        • 33014 ☆ A M B ☆
        • 1,231 Posts
        僕のサーバもバージョンアップされたというので試してみました。
        …化けますね。
          • 19033
          • 892 Posts
          こんにちは。
          yamaさん。ようこそ、こちら側の世界へ grin

          ssssssss soushi さん!
          化けないです!すごいです。
          save_web_user.processor.php の方も該当すると思われる箇所を
          同じように直してやってみましたが、化けなくなりました。

          これ、あとカテゴリのとこもやれば良いんでしょうか。どれだろ。。
            • 33014 ☆ A M B ☆
            • 1,231 Posts
            grepで見た感じ、save_htmlsnippet.processor.phpやsave_module.processor.phpあたりかな?
            (他、チャンクやプラグイン・テンプレートなども)
            categories.inc.phpにもそれっぽいのがあるけど、これは違いますよね?
              • 33463
              • 35 Posts
              あらうっかりWebユーザで試してました!
              管理ユーザの方で確認したら文字化けしませんでした。
              よー読まなあきませんね^^; ごめんなさいsoushiさんm(_ _)m
                • 28073
                • 164 Posts
                おぉ、無事に表示されるようになりましたか~。
                と、こちらももう少し調べてみました。
                yamaさんの言うように/manager/includes/categories.inc.phpのカテゴリを新規に作成するnewCategory関数にもmysql_escape_string関数がありますね。
                こちらもnewCategoryが呼び出される前に既にmysql_escape_stringが行われてます。
                カテゴリの文字化けを抑えるには

                /manager/includes/categories.inc.php 6行目付近
                function newCategory($newCat) {
                    global $modx;
                    $useTable = $modx->getFullTableName('categories');
                    $sql = 'insert into ' . $useTable . ' (category) values (\''.mysql_escape_string($newCat).'\')';
                


                ↓4行目を変更

                function newCategory($newCat) {
                    global $modx;
                    $useTable = $modx->getFullTableName('categories');
                    $sql = 'insert into ' . $useTable . ' (category) values (\''.$newCat.'\')';
                


                で、ほぼ解決すると思います。
                ただ問題があってmysql_escape_string関数はSQLインジェクションを抑える重要な関数なのです。
                ソースを編集して余分なmysql_escape_string関数を取り除く事でもし、mysql_escape_string関数を通らずにSQLが実行されるパターンが発生すると外部からの不正アクセスに非常に弱くなります。
                僕もソース全体を見れてるわけではないので、修正する場合は覚悟を決めてください :’(
                (多分大丈夫だとは思うのですが)

                また、この件の続きがありまして…。
                MEGUさん達の場合はカテゴリに入力した日本語が化けるのですが、日本語が化けない環境でも入力欄に「’(シングルコーテーション)」を入力すると「\’」と先頭に\マークがついてしまいます。
                ユーザ管理では編集して保存するたびに「\\\’」と\が増えていきます。
                これもmysql_escape_string関数を2重に通してるのが原因みたいです。
                バグ扱いで本家に上げたほうがいい気がしますが、どなたか上げることできますか?
                (すいません、英語がかけないもので… :’(勉強せねば)

                ついでにmysql_escape_stringは既に非推奨関数になってて、今はmysql_real_escape_stringを使えって事になってるみたいですね。
                (参考)http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_59
                この変更は古いMySQLを切り捨てるし、英語圏の人たちはどっちの関数を使っても影響がないので変えてくれないかなぁ。。。

                文字化けの件から思いがけない問題が掘り起こされちゃったような。


                  • 19033
                  • 892 Posts
                  こんにちは。soushi さん。yama さん。ありがとうございます。

                  > soushi さん。categories.inc.php を修正することにより、
                  カテゴリを新規作成する際の文字化けがなくなりました。
                  どうもありがとうございます。 laugh

                  それで、その上で、確認なのですが、
                  ・文字化け対策として外した「mysql_escape_string」は、ある悪意ある攻撃に対して有効な大事な関数である。
                  ということですね?

                  それで、今回、「save_web_user.processor.php」「save_web_user.processor.php」「categories.inc.php」から、
                  余分な「mysql_escape_string」を取ったわけですが、この場合、「mysql_escape_string関数を通らずにSQLが実行されるパターン」というのは、
                  MODxのコアシステムだけを心配すればいいのでしょうか。あるいは、拡張(pluging やスニペット)に対しても考えなければならないのでしょうか。
                  (すみません。システムのことが良くわかってないので、日本語が変です...)。

                  それと、バグとしてあげる場合、

                  あるサーバー環境で、ユーザ/ウェブユーザのロングネームが文字化けする
                  および、カテゴリの新規作成時に文字化けする。
                  また、、ユーザ・ウェブユーザのロングネームおよび、カテゴリの新規作成でシングルクォーテーションを
                  入力すると「\」が挿入される。

                  というのが現象ですよね?で、その原因として、「save_web_user.processor.php」「save_web_user.processor.php」「categories.inc.php」
                  で「mysql_escape_string」を2重に通しているから。でいいんでしょうか(でもカテゴリの方は2重じゃないですよね???)。

                  また、現在では、「mysql_escape_string」ではなく、「mysql_real_escape_string」を使うのが妥当ではないか。
                  ということですよね→けれど、それは、mysql 3.23.14未満 を切り捨てることになる。

                  ...ということでsousihさんのおっしゃる趣旨としてあってるでしょうか。。。

                  それでバグってどこに報告すれば...? ^^;
                    • 33014 ☆ A M B ☆
                    • 1,231 Posts
                    http://modxcms.com/forums/index.php?board=8.0
                    報告するとしたらココかな?

                    今回はコア側に問題があるらしいことが分かったけど、サーバによって挙動が違うってのも気になりますね。
                    コア側の問題にあえて目をつぶるとしたら、サーバ側の何を変えたらいいのかなども知りたいです。
                      • 28073
                      • 164 Posts
                      こんばんわです smiley

                      Quote from: MEGU at Nov 23, 2007, 01:54 AM

                      それで、その上で、確認なのですが、
                      ・文字化け対策として外した「mysql_escape_string」は、ある悪意ある攻撃に対して有効な大事な関数である。
                      ということですね?

                      そうですね、これをやってないと外からデータを引き抜かれたり、サイトをのっとられたりする恐れがあります。
                      ただ、mysql_escape_stringを2重に通ってしまうと文字化け等の別の問題が発生するという…。

                      Quote from: MEGU at Nov 23, 2007, 01:54 AM

                      それで、今回、「save_web_user.processor.php」「save_web_user.processor.php」「categories.inc.php」から、
                      余分な「mysql_escape_string」を取ったわけですが、この場合、「mysql_escape_string関数を通らずにSQLが実行されるパターン」というのは、
                      MODxのコアシステムだけを心配すればいいのでしょうか。あるいは、拡張(pluging やスニペット)に対しても考えなければならないのでしょうか。
                      (すみません。システムのことが良くわかってないので、日本語が変です...)。

                      今のところコアシステムの部分だけ心配すればいいと思います。
                      (ほかにも探すと何あるかもしれませんが)

                      あと今回はPOSTからデータを取得するときにmysql_escape_stringをかけて、更にSQL文を作るときにmysql_escape_stringをかけてるため、「どちらを生かすか」を開発チームで議論する必要があると思います。
                      僕は手っ取り早く前者を生かしてしまったのですが、本来は後者を生かしたほうがいいのかなって思ってます。
                      (が、ソースの修正が多くなりそうな気がします)

                      Quote from: MEGU at Nov 23, 2007, 01:54 AM

                      あるサーバー環境で、ユーザ/ウェブユーザのロングネームが文字化けする
                      および、カテゴリの新規作成時に文字化けする。
                      また、、ユーザ・ウェブユーザのロングネームおよび、カテゴリの新規作成でシングルクォーテーションを
                      入力すると「\」が挿入される。

                      というのが現象ですよね?で、その原因として、「save_web_user.processor.php」「save_web_user.processor.php」「categories.inc.php」
                      で「mysql_escape_string」を2重に通しているから。でいいんでしょうか(でもカテゴリの方は2重じゃないですよね???)。

                      バグとしてあげる場合、「カテゴリを新規で作成するときに’(シングルコーテーション)を入れてみなよ」や「ユーザ名に’(シングルコーテーション)を入れて作成し、何度も編集→保存やってみなよ。」で問題を認識してくれると思います。
                      日本語が化けるのはMySQLとPHPのバージョンに依存してそうな気がしますが、多分上記の問題が解決すればおそらく一緒に文字化けの件も解決されます。
                      (MySQL4.0系が問題なのかなぁとちょっと思ってます)

                      あ、あとカテゴリも2重になってます。

                      Quote from: MEGU at Nov 23, 2007, 01:54 AM

                      ...ということでsousihさんのおっしゃる趣旨としてあってるでしょうか。。。

                      話がややこしくてすいません。
                      しかも僕の説明も下手で中途半端なので… :’(
                      でも、おおむねMEGUさんの書かれている通りです。

                      Quote from: yama at Nov 23, 2007, 02:04 AM

                      今回はコア側に問題があるらしいことが分かったけど、サーバによって挙動が違うってのも気になりますね。
                      コア側の問題にあえて目をつぶるとしたら、サーバ側の何を変えたらいいのかなども知りたいです。

                      これはコア側に手を入れないと完全修正は難しそうです。
                      サーバによる挙動の違いはMySQLのバージョンかなぁとにらんでるのですが、今のところ完全なカンです rolleyes