We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 29228
    • 109 Posts
    可能な限り、ユーザー登録無しのサイトを作ろうとしています。
    簡易的なblogを作り誰でもコメント出来る設定を考えているのですが、コメントSPAMに無防備な状態ですので、ユーザー登録で使うCAPTCHAコードを入力しないと投稿出来ないようにしました。
    そこで教えて頂きたいのは、MODxでリダイレクトの設定方法です。
    もしかしたら、ドキュメント内にタグみたいなのがあるのかも知れませんが、見付けられませんでした。
    現在は
    $formcode = $_POST['formcode'];
    if($_SESSION['veriword']!=$formcode){
    return 'Enter Code!';

    のようにエラーだけ表示するようにしていますが、これを元のコメントフォームがあるページにリダイレクトしたいと考えています。
    良い方法があれば、ご教授下さい。

    もう一点、
    ユーザー登録でCAPTCHAコードを表示するタグに
    src="manager/includes/veriword.php?rand=<? echo rand(); ?>

    とあるのですが、これのrand()って何をするのでしょう?
    UserCommentsに移植する時に、PHPを解釈してくれなかったのですが、rand=~~~が無くても、問題なく機能したので「これはいったい何?」って感じです。
    よろしくお願いします。
      • 8382
      • 253 Posts
      こんにちは、takumiさん。
      普通のblogのようなコメントをお考えだと思います。
      そういうのがMODxに欠けているのは確かですね。
      出来上がったらとても素晴らしいと思います。
      これを元のコメントフォームがあるページにリダイレクトしたいと考えています。
      UserCommentsの改造で行うのなら、フォームもアクションも自分自身ですね?
      MODxのログインでは通常webLoginAlert()を使ってJavascriptでアラートを表示してそのまま戻っています。
      通常の方法は、UserCommentsの最初のほうにある
      $url = $modx->makeURL($id);
      $modx->sendRedirect($url);

      が最も楽にリダイレクトできるはずです。

      src="manager/includes/veriword.php?rand=<? echo rand(); ?>
      確かにコード内では使用しているようには見えません。
      推測するなら一回空回しをしているのかもと思います。
      Etomite0.6のCaptchaにはrand()はありませんでした。
      しかし、Etomite0.6.1RTMでは ..veriword.php?dummy=<? echo rand(); ?>
      となっているからです。
      詳しくは直接開発チームに聞いてみたほうがいいでしょう。
        • 29228
        • 109 Posts
        eastbindさん、こんにちは。(書き込みは早朝ですが grin

        あ!そうか!JavaScriptを使えば面倒なリダイレクトを使わずにすんだんですよね。(^^;
        まったくもって情けない。。。

        rand()なんですが、ソースを追ってみました。
        どぉ~やら、これはCAPTCHA画像へランダムにノイズを加えるようです。
        画像に表示する文字列を小さくしたり、斜めに表示したり・・・・。
        自動解析を多少は防御するのに必要って事で、やっぱりrand()も表示するように手直ししました。
        <img src="manager/includes/veriword.php?rand='.rand().'"

        先ほどはPHPの開始タグと終了タグがあったので、機能しなかったんですよね。
        スニペット作成で良くあるうっかりミスでした。(^^;

        これでとりあえず必要な機能はそろいました。
        この修正は非常に簡単ですんで、やってみたい方にはお勧めです。
        UserCommentsスニペットで
        switch ($isPostBack)

        とあるブロック内に上記に記したコードを追記するだけでOKです。
        自分はスニペット内のフォームテンプレートを修正してCAPTCHA画像を貼り付けましたが、チャンクに登録して呼び出しても良いと思います。

        ご指導ありがとうございました。 wink
          • 8382
          • 253 Posts
          takumiさん。
          captchaClassで使用されているのはPHPのrand関数であって、引数のrandではないんです。
          だからこの部分(?rand=rand())は無くても見た目正常に機能するはずです。
          本当にダミーで一回余計にrand()を使用しているだけ。 huh
          ソースからは理由を推し量れないので聞いてみるしかないというわけです。

          後、cpatchClass内でsessionが開始されています。(セッション変数を使用するので当たり前ですね)
          これの後始末とかどうしていますでしょうか?loginするならlogoutまで何もしなくてもよいのですが。
          このへんがややこしくて、同様なものを構想しましたが恥ずかしながら挫折しています :’(
            • 29228
            • 109 Posts
            Quote from: eastbind at Mar 14, 2006, 02:41 AM

            captchaClassで使用されているのはPHPのrand関数であって、引数のrandではないんです。
            だからこの部分(?rand=rand())は無くても見た目正常に機能するはずです。
            本当にダミーで一回余計にrand()を使用しているだけ。 huh
            ソースからは理由を推し量れないので聞いてみるしかないというわけです。
            あ、ほんとですね。(^^;
            ただ単にランダムな整数を吐いてるだけ。。。
            HTMLソースから自動投稿スクリプトの解析を防ぐ為のランダム整数なのかな? huh

            sessionは考えていませんでした。(笑)
            って、どうしたらいいのだろう?
            これ、もうちょっと煮詰める必要がありますね。。。
            これから情報を漁って来ます。
            何か良い案があれば、投稿よろしくお願いします。 wink

            追記:
            http://fol.axisz.jp/php/man/pear/package.text.text-captcha.html
            ここらが参考になるかも?
            投稿後のreturnでunset($_SESSION[省略])とすれば大丈夫?