[解決済み] 1.04にしたら買い物カゴに商品が追加できなくなった

2011 年 7 月 4 日

ホーム フォーラム 使い方全般 [解決済み] 1.04にしたら買い物カゴに商品が追加できなくなった

このトピックには19件の返信が含まれ、3人の参加者がいます。6 年、 4 ヶ月前 n.tanabe さんが最後の更新を行いました。

15件の投稿を表示中 - 1 - 15件目 (全20件中)
  • 投稿者
    投稿
  • #50522

    mamekichi
    参加者

    動作に関するご質問の場合は必ずご記入ください。


    Welcart のバージョン:1.04とdevelopment version

    症状を確認したブラウザ:Camino

    サーバー(会社名、サービス名):xrea

    SSLの利用:共用SSL

    WordPress のパーマリンク設定:デフォルト


    こんにちは

    お世話になります。

    複数の種類の商品を買い物カゴに入れようとしても、後から選んだ商品に上書きされて1種類しか入りませんでした。

    別のプラグインが関係しているということはあるでしょうか?

    とりあえず、1.04にバージョンアップの前後に最近追加したプラグインを外しましたが結果は同じでした。

    1.03に戻したら正常に追加できました。

    #62331

    mamekichi
    参加者

    追伸です。公開していないPCに1.04をインストールしたら正常に動作しました。

    どちらもWelcartのデフォルトのテーマを使っています。

    違いをこれから調べます。

    #62332

    mamekichi
    参加者

    お世話になります。

    SSLをonにすると追加できなくなります。

    「追伸」で正常に動作した(ローカルの)PCではSSLはoffでした。

    販売用に公開しているドメインとは別のドメインに最初からインストールしてSSLのon/offを試したところ、onにすると追加できませんでした。テーマはwelcart_defaultです。

    エラー表示はありません。

    さて、何に手をつければよいのでしょうか…..

    追記:現在1.03に切り替えて運用していますが、Paypalとポイントの不具合があります。この点だけ直すことは可能でしょうか?

    よろしくお願いいたします。

    #62333

    nanbu
    参加者

    こんにちは。

    なぜ、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とポイントの不具合修正は簡単ではないので、こちらの修正が良いと思います。

    よろしくお願いいたします。

    #62334

    mamekichi
    参加者

    nanbu様

    こんにちは

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

    ご返事に気がつくのが遅れまして、とりあえず、応急措置として、1.03に戻して、includes/purchase_button.phpだけ1.04のものと置き換えています。

    教えていただいた方法は後ほど試してご報告いたします。

    ありがとうございました。

    #62335

    mamekichi
    参加者

    お世話になります。

    テスト用の環境で1.04のusceshop.class.phpに教えていただいた修正をしましたが、残念なことに結果は同じでした。

    他に何か手がかりがありましたらご教授ください。よろしくお願いいたします。

    #62336

    mamekichi
    参加者

    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アドレスを逆引きして下さい。

    —-引用終わり


    このことが関係しているのではないかと思うのですが、知識がないので自信がありません。

    よろしくご教授願います。

    #62337

    nanbu
    参加者

    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'];
    }

    #62338

    mamekichi
    参加者

    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サーバーのアドレスが入っていました。

    #62339

    nanbu
    参加者

    そうですか。きっとhttp:// では$_SERVER、https:// では$_SERVER になるんでしょう。

    セキュリティーが下がってしまいますが、フィルターを次のようにすると通ると思います。返す文字列は何でも構いません。

    add_filter('usces_sessid_force', 'my_sessid_force');
    function my_sessid_force( $notuse ){
    return 'NONEADDR';
    }

    #62340

    mamekichi
    参加者

    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に変えると、カゴに追加できますが、そのとき****の部分はカゴに入れる前後で同じ値が保持されています。

    #62341

    mamekichi
    参加者

    nanbu様 

    大変お世話になっています。

    【修正1】【修正2】とFilterでOKと理解しましたが、何故か【修正2】の部分が動作しません。

    $postfix=apply_filters(‘usces_sessid_force’,$postfix);

    echo ‘ forced=’ . $postfix;

    と書いてエコーしてみても、forced= と表示されるだけです。

    試しにfilterのreturn直前に echo ‘ACTIVE’; と書いても表示されません。【修正1】の方は表示されます……。何か他に書くべきことがあるのでしょうか?

    よろしくお願いいたします。

    #62342

    nanbu
    参加者

    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';
    }

    尚、このフィルターをかけますとセキュリティーが落ちますのでご注意下さい。

    #62343

    mamekichi
    参加者

    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 ) {

    の部分です。

    トピックとずれてしまいますが、引き続きお願いいたします。

    #62344

    nanbu
    参加者

    そこでのエラーは異常な状況でなければ出ないはずです。セッションを操作していますので、テストはブラウザを起動しなおすなどして同様な症状が出るかを確かめてみていただけますでしょうか。

15件の投稿を表示中 - 1 - 15件目 (全20件中)

このトピックに返信するにはログインが必要です。