[解決済み] 1.04にしたら買い物カゴに商品が追加できなくなった
-
投稿者投稿
-
2011年7月4日 3:13 AM #50522mamekichi参加者
動作に関するご質問の場合は必ずご記入ください。
Welcart のバージョン:1.04とdevelopment version
症状を確認したブラウザ:Camino
サーバー(会社名、サービス名):xrea
SSLの利用:共用SSL
WordPress のパーマリンク設定:デフォルト
こんにちは
お世話になります。
複数の種類の商品を買い物カゴに入れようとしても、後から選んだ商品に上書きされて1種類しか入りませんでした。
別のプラグインが関係しているということはあるでしょうか?
とりあえず、1.04にバージョンアップの前後に最近追加したプラグインを外しましたが結果は同じでした。
1.03に戻したら正常に追加できました。
2011年7月4日 3:35 AM #62331mamekichi参加者追伸です。公開していないPCに1.04をインストールしたら正常に動作しました。
どちらもWelcartのデフォルトのテーマを使っています。
違いをこれから調べます。
2011年7月4日 6:42 AM #62332mamekichi参加者お世話になります。
SSLをonにすると追加できなくなります。
「追伸」で正常に動作した(ローカルの)PCではSSLはoffでした。
販売用に公開しているドメインとは別のドメインに最初からインストールしてSSLのon/offを試したところ、onにすると追加できませんでした。テーマはwelcart_defaultです。
エラー表示はありません。
さて、何に手をつければよいのでしょうか…..
追記:現在1.03に切り替えて運用していますが、Paypalとポイントの不具合があります。この点だけ直すことは可能でしょうか?
よろしくお願いいたします。
2011年7月6日 3:05 AM #62333nanbuキーマスターこんにちは。
なぜ、xrea でセッションが渡らないのか、原因が良く掴めないのですが、もしセキュリティーを強化した事が原因だったとすると、以下のように修正すれば動作するかもしれません。
【Welcart 1.0.4】
usc-e-shop/classes/usceshop.class.php 5550行目
if( 'acting' != $addr && 'mobile' != $addr && $postfix != $addr ) {
↓
if( 'acting' != $addr && 'mobile' != $addr && $postfix != $addr && !empty($_SERVER['REMOTE_ADDR'])) {Paypalとポイントの不具合修正は簡単ではないので、こちらの修正が良いと思います。
よろしくお願いいたします。
2011年7月6日 4:26 AM #62334mamekichi参加者nanbu様
こんにちは
ご返事ありがとうございます。
ご返事に気がつくのが遅れまして、とりあえず、応急措置として、1.03に戻して、includes/purchase_button.phpだけ1.04のものと置き換えています。
教えていただいた方法は後ほど試してご報告いたします。
ありがとうございました。
2011年7月6日 7:45 AM #62335mamekichi参加者お世話になります。
テスト用の環境で1.04のusceshop.class.phpに教えていただいた修正をしましたが、残念なことに結果は同じでした。
他に何か手がかりがありましたらご教授ください。よろしくお願いいたします。
2011年7月7日 3:24 AM #62336mamekichi参加者nanbu様
こんにちは
お世話になります。
昨日修正した箇所の1つ前の関数uscescvのif( $flag ){}において、中身の$sessid = …の行だけを残したところ(要するに$flag=FALSEと同じこと)、複数の商品がカートに入りました。
もとに戻すと、1種類しか入りませんが、そのときのsessionIDをブラウザからコピーしてデコードしてみてもaddressが得られませんでした。(デコードをしてくれるサイトを利用しましたので、操作に誤りがあるかもしれません)。
そこで思い出したのですが、xreaのSSLの注意書きとして、以下の文章があります。
—-引用開始—-
・代替サーバーを介するため、REMOTE_ADDR,REMOTE_HOSTが取得出来ません。
REMOTE_ADDRの代わりに、HTTP_X_FORWARDED_FORを使って下さい。
REMOTE_HOSTはHTTP_X_FORWARDED_FORのIPアドレスを逆引きして下さい。
—-引用終わり
このことが関係しているのではないかと思うのですが、知識がないので自信がありません。
よろしくご教授願います。
2011年7月7日 7:48 AM #62337nanbuキーマスターmamekichi さん、情報ありがとうございます。
正にその通りです。何らかの理由でzrea では$_SERVER が取得できないと思い前回修正案を提示させて頂きましたが、取得できないのではなくて別の値が入ってしまっていたのですね。
そもそもこの様なサーバーはEC構築には不向きなのですが、上位のCORESERVERも恐らく同じ仕組みでしょう。(更にセーフモードでしたよね)
次のような修正が有効でしたら正式にWelcart 本体に組み入れたいと思います。お手数でなければ試してみていただけますでしょうか。
usc-e-shop/classes/usceshop.class.php
【修正1】
5536 $postfix = ( isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR']) ) ? $_SERVER['REMOTE_ADDR'] : 'REMOTE_ADDR';
5537 $sessid = $chars . '_' . $postfix;
↓
5536 $postfix = ( isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR']) ) ? $_SERVER['REMOTE_ADDR'] : 'REMOTE_ADDR';
追加行 $postfix = apply_filters('usces_sessid_force', $postfix);
5537 $sessid = $chars . '_' . $postfix;【修正2】
5548 $postfix = ( isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR']) ) ? $_SERVER['REMOTE_ADDR'] : 'REMOTE_ADDR';
5549 if( 'acting' != $addr && 'mobile' != $addr && $postfix != $addr ) {
↓
5548 $postfix = ( isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR']) ) ? $_SERVER['REMOTE_ADDR'] : 'REMOTE_ADDR';
追加行 $postfix = apply_filters('usces_sessid_force', $postfix);
5549 if( 'acting' != $addr && 'mobile' != $addr && $postfix != $addr ) {【フィルター】
テーマ内functions.php に追記
add_filter('usces_sessid_force', 'my_sessid_force');
function my_sessid_force( $notuse ){
return $_SERVER['HTTP_X_FORWARDED_FOR'];
}2011年7月8日 4:57 AM #62338mamekichi参加者nanbu様
こんにちは
大変お世話になっております。
教えていただいたコードを書いて試しましたが、結果はNGでした。
そこで、関数 uscescv が $sessidを返す手前で、sessidの値をechoしてみました。
echo “sessid=” . $sessid . “n”;
$sessid =urlencode(base64_encode($sessid));
return $sessid;
}
すると、同一のsessid=なんとか_IPアドレス が 8回出力され、
最後にもう一回、sessid=なんとか_acting と出力されました。
この最後の1回をエンコードしたものが、uscesid=以下に表示されるものと同一です。
なお、my_sessid_force()の中で、$_SERVERをechoさせてみたところ、8回同じアドレスが表示されました。
アドレスは取得できているのですが、短時間に8回も9回も取得しようとするとサーバーがアドレスを返さないというような仕組みになっているのではないかと想像します。
この回数を減らすことができれば、解決しそうな気がしますが、いかがでしょうか?
よろしくお願い申し上げます。
追記1
sessid=なんとか_IPアドレスは、
0ph3096q19ff2fr5g48vd1it4c378q0ij35s6g0_219.116.225.17
sessid=なんとか_actingは、
0ph3096q19ff2fr5g48vd1it4c378q0ij35s6g0_acting
です。
追記2
参考になるかどうかわかりませんが…..
$_SERVER にもアドレスが入っていました。
でも、
$_SERVER;
とは全く別のアドレスでした。後者にはsslサーバーのアドレスが入っていました。
2011年7月8日 8:27 AM #62339nanbuキーマスターそうですか。きっとhttp:// では$_SERVER、https:// では$_SERVER になるんでしょう。
セキュリティーが下がってしまいますが、フィルターを次のようにすると通ると思います。返す文字列は何でも構いません。
add_filter('usces_sessid_force', 'my_sessid_force');
function my_sessid_force( $notuse ){
return 'NONEADDR';
}2011年7月8日 9:45 AM #62340mamekichi参加者nanbu様
大変お世話になっています。
return ‘NONEADDR’;を試しましたが、結果は同じでした。
uscescv()のurlencodeの直前に$sessidをechoしましたが、
9回uscescvが呼ばれ、8回までは ***_NONEADDRでしたが、
9回目は***_acting と表示されました。NONEADDRではなく
actingにすれば動くのですが、解決になっていないですよね。
もっと調べてみます。
追伸
サーバーが返さなくなるという推測は間違いだったと思います。uscescv()のflagが8回まではtrueで9回目がfalseということですね。
追記
$sessidをechoしたときの****_NONEADDRの****の部分が、カゴに入れる前とカゴに入れた後では異なっていました。
前に戻ってカゴに入れ直すたびに値が変化します。
違っていれば同じカゴに入らないのは当然ということですね。
$postfixをactingに変えると、カゴに追加できますが、そのとき****の部分はカゴに入れる前後で同じ値が保持されています。
2011年7月9日 10:37 AM #62341mamekichi参加者nanbu様
大変お世話になっています。
【修正1】【修正2】とFilterでOKと理解しましたが、何故か【修正2】の部分が動作しません。
$postfix=apply_filters(‘usces_sessid_force’,$postfix);
echo ‘ forced=’ . $postfix;
と書いてエコーしてみても、forced= と表示されるだけです。
試しにfilterのreturn直前に echo ‘ACTIVE’; と書いても表示されません。【修正1】の方は表示されます……。何か他に書くべきことがあるのでしょうか?
よろしくお願いいたします。
2011年7月11日 1:35 AM #62342nanbuキーマスターmamekichi さん、いろいろテストありがとうございます。
どうやら、uscesdc() でのapply_filters(‘usces_sessid_force’,$postfix) が、タイミングの問題でうまく動作していない事が分かりました。
usces_session_start のタイミングをずらして修正いたしましたので、Development Version をご利用いただけますでしょうか。
functions.php には前に書きましたとおり、このフィルターで大丈夫です。文字列にacting は使わないようにして下さい。動作はどちらも一緒ですがacting は他の動作に利用する場合がございます。
add_filter('usces_sessid_force', 'my_sessid_force');
function my_sessid_force( $notuse ){
return 'NONEADDR';
}尚、このフィルターをかけますとセキュリティーが落ちますのでご注意下さい。
2011年7月11日 3:34 AM #62343mamekichi参加者nanbu様
ありがとうございます。
カートに追加されるようになりました。
ただ、「内容確認」のページにいくと、、下記のワーニングが表示されるようになりました。これは、会員登録せずに操作した場合です。会員としてログインした場合は表示されません。
Warning: Invalid argument supplied for foreach() in /..<省略>../wp-content/plugins/usc-e-shop/classes/usceshop.class.php on line 3367
これは、
function get_member() {
foreach ( $_SESSION as $key => $value ) {
の部分です。
トピックとずれてしまいますが、引き続きお願いいたします。
2011年7月12日 1:38 AM #62344nanbuキーマスターそこでのエラーは異常な状況でなければ出ないはずです。セッションを操作していますので、テストはブラウザを起動しなおすなどして同様な症状が出るかを確かめてみていただけますでしょうか。
-
投稿者投稿
- このトピックに返信するにはログインが必要です。