WebLoginによるパスワードの再発行  【解決済み】

質問全般・改善要望
返信する
shintata
メンバー
メンバー
記事: 3
登録日時: 2009年8月11日(火) 17:03

WebLoginによるパスワードの再発行  【解決済み】

投稿記事 by shintata »

WebLoginのパスワードの再発行についてです

modxをインストール後のサンプルサイトです
サンプルサイトには何も手を加えていません
(ウェブユーザーは作成しました)

作成したウェブユーザーでログイン
→OK

パスワードを忘れた場合の再発行の手続きをします
「パスワードをお忘れですか?」
 →メールアドレス入れて再発行
  →メールが来る

メーラーはThunderbirdを使っています
届いたメールに書かれている、再発行したパスワードを有効にするためのURLが
http://hoge.com/index?webloginmode=actp&wli=2&wlk=hogehoge
となっています
ここに飛んでも再発行されたパスワードが有効になりません

で、ヤフーのフリーメールだったので、ブラウザからヤフーメールを参照したら、上記URLが
http://hoge.com/index?webloginmode=actp&wli=2&wlk=hogehoge
となっていたのです
しかも、こちらだと再発行されたパスワードが有効になります

「&」を実体参照したURLとしてないURLとで結果が違ってしまうんです
原因がわかっているにもかかわらず、直し方がわかりません…ナサケナイ

いますぐ直さないと困るわけではないので(まだユーザーいないし)、お暇なときに解決方法を教えてください
**************************************************
shintata
http://shintata.com
http://rea.la
**************************************************
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: WebLoginによるパスワードの再発行

投稿記事 by yama »

これってMODxの問題というよりブラウザの問題のような気がしますが、両者で違いが出るのは不思議ですね。文字実体参照でamp;に展開するほうがいちおうvalidということになっていて、MODx管理画面のグローバル設定「XHTML形式のURL」でもデフォルトで「はい」になってますが・・ここをとりあえず「いいえ」にしておくと参照変換オフで揃うと思います。
sama55
メンバー
メンバー
記事: 816
登録日時: 2009年8月03日(月) 08:16

Re: WebLoginによるパスワードの再発行

投稿記事 by sama55 »

yamaさんの対応方法でもいけることは確認しましたが、ちょっと影響が心配になりました。
局所的に対応するのであれば下でしょうか。(他にも数箇所ありそうですが。。。)
ソース : assets/snippets/weblogin/weblogin.common.inc.php (L62)

コード: 全て選択

//        $message = str_replace("[+surl+]",$site_url,$message);
        $message = str_replace("[+surl+]",htmlspecialchars_decode($site_url),$message);
※manager/includes/controls/modxmailer.inc.phpのL69で一括して・・・とも思いましたが、メールの本文に" "や"&"があるとまずいですもんね。。。
shintata
メンバー
メンバー
記事: 3
登録日時: 2009年8月11日(火) 17:03

Re: WebLoginによるパスワードの再発行

投稿記事 by shintata »

IE6~8、Firefox、Safari、Opera、Chrome(IE以外は最新版)で試してみました
実体参照のURL(amp;の方)だとダメ、実体参照じゃないURLだとOKでした
sama55 さんが書きました:yamaさんの対応方法でもいけることは確認しましたが、ちょっと影響が心配になりました。
局所的に対応するのであれば下でしょうか。(他にも数箇所ありそうですが。。。)
ソース : assets/snippets/weblogin/weblogin.common.inc.php (L62)

コード: 全て選択

//        $message = str_replace("[+surl+]",$site_url,$message);
        $message = str_replace("[+surl+]",htmlspecialchars_decode($site_url),$message);
※manager/includes/controls/modxmailer.inc.phpのL69で一括して・・・とも思いましたが、メールの本文に" "や"&"があるとまずいですもんね。。。
僕もグローバル設定で「いいえ」にしたらOKになりました
でもxml宣言したら実体参照しないとですしねぇ

weblogin.processor.inc.phpの104行目のとこにも同じ記述がありますがここも直しといた方が良いですかね?
(やっぱりPHP勉強しないとだめだなぁ…)
**************************************************
shintata
http://shintata.com
http://rea.la
**************************************************
sama55
メンバー
メンバー
記事: 816
登録日時: 2009年8月03日(月) 08:16

Re: WebLoginによるパスワードの再発行

投稿記事 by sama55 »

modxmailerのクラスインスタンスを作ってる箇所で、site_urlを埋め込んでるところはすべてでしょうね。
(X)HTMLコード上では実体参照は必須だと思いますが、modxmailerでphpmailerをプレーンテキストで送出するようオーバーロードしてますから、グローバル設定に関わらずデコード("&"のみに)するのが正解のよ~な気がします(ちょっと自信ないです :oops: )。
メールをHTML形式で送れば問題ないのでしょうけど。。。
shintata
メンバー
メンバー
記事: 3
登録日時: 2009年8月11日(火) 17:03

Re: WebLoginによるパスワードの再発行

投稿記事 by shintata »

sama55 さんが書きました:modxmailerのクラスインスタンスを作ってる箇所で、site_urlを埋め込んでるところはすべてでしょうね。
(X)HTMLコード上では実体参照は必須だと思いますが、modxmailerでphpmailerをプレーンテキストで送出するようオーバーロードしてますから、グローバル設定に関わらずデコード("&"のみに)するのが正解のよ~な気がします(ちょっと自信ないです :oops: )。
メールをHTML形式で送れば問題ないのでしょうけど。。。
weblogin.common.inc.phpの62行目をご指示いただいた通りに修正したらうまくいきました

でも、weblogin.processor.inc.phpの104行目も直したらエラーになっちゃいました

コード: 全て選択

Fatal error: Call to undefined function: htmlspecialchars_decode() in /home/sites/●●●●●/assets/snippets/weblogin/weblogin.processor.inc.php  on line 104
元に戻したら大丈夫でした
PHPのわからない僕には何が何だかさっぱり…

でもweblogin.common.inc.phpの修正で解決したので、しばらくはこのまま様子見ます
不都合が生じたらまた報告しますのでよろしくお願いします
ありがとうございました
**************************************************
shintata
http://shintata.com
http://rea.la
**************************************************
sama55
メンバー
メンバー
記事: 816
登録日時: 2009年8月03日(月) 08:16

Re: WebLoginによるパスワードの再発行

投稿記事 by sama55 »

shintata さんが書きました:weblogin.common.inc.phpの62行目をご指示いただいた通りに修正したらうまくいきました
OK
shintata さんが書きました:でも、weblogin.processor.inc.phpの104行目も直したらエラーになっちゃいました

コード: 全て選択

Fatal error: Call to undefined function: htmlspecialchars_decode() in /home/sites/●●●●●/assets/snippets/weblogin/weblogin.processor.inc.php  on line 104
元に戻したら大丈夫でした
エラーの内容が奇妙ですね。。。
htmlspecialchars_decode()のかわりにhtml_entity_decode()にしたらどうでしょ?
htmlspecialchars_decode関数はPHP5.1.0以上の実装で、html_entity_decode関数はPHP4.3.0以上のようですので、広範囲な環境をカバーするhtml_entity_decodeの方が良さそうです。html_entity_decodeのデフォルトキャラクタセットはISO-8859-1(latin-1)ですが、このケースではURLにマルチバイト文字は入らないと思いますので、関数の差し替えだけで問題ないと思います(システムの修正時はちゃんとキャラクタセットを指定した方がイイでしょうね ^^;)。

類似問題が発生する可能性のある箇所は下の4箇所?("MODxMailer"でgrepし、global $site_url; や $modx->makeUrl()でパスを引用/生成してるところ)

assets\snippets\weblogin\weblogin.common.inc.php(67): $mail = new MODxMailer();
assets\snippets\weblogin\weblogin.processor.inc.php(110): $mail = new MODxMailer();
manager\processors\save_user.processor.php(469): $mail = new MODxMailer();
manager\processors\save_web_user.processor.php(419): $mail = new MODxMailer();
返信する