3

私はこれを分類したと思っていましたが、問題が発生しました。顧客登録フォームに「ハニーポット」を追加したいのですが、この手法に慣れていない場合は、CSSを使用してテキスト入力を非表示にし、平均的なボットが入力することを想定しています。ただし、人間はフィールドを表示しないため、空として検証する必要があります。

Magentoで新しいモジュールを作成し、config.xmlに以下を追加しました。

<global>
    <fieldsets>
        <customer_account>
            <honeytrap><create>1</create><update>1</update></honeytrap>
        </customer_account>
    </fieldsets>
    <models>
        <customer>
            <rewrite>
                <customer>MyStore_Honeytrap_Model_Customer</customer>
            </rewrite>
        </customer>
    </models>
</global>

次に、validate関数に少し余分に追加して、フィールドが空であることを確認しました。これは私が見る限りすべて正しいですが、ほぼline 278AccountController.phpextractData()リクエストの投稿データから入力フィールドを破棄します。私はまだMagentoに慣れていないので、ここでも何かを学びたいと思っていますが、フィールドが投稿から削除されるのを防ぐにはどうすればよいextractData()ですか?

何が欠けているのか知りたいだけだと思います。カスタムフィールドの追加に関するインターネット上のいくつかの投稿を読んだことがありますが、これが機能するはずですが、うまくいかなかったために何かを見逃した可能性があります。このフィールドをデータベースに保存する必要がないので、エンティティの設定を含めます。これは、登録が人間からのものであることを純粋に検証するためです(可能な限り)。

助けてくれてありがとう、私が逃したのはおそらくばかげていることだと確信しています。

編集:イベントの使用に関する@ gordon-knoppeポインターに感謝します:

public function check_trap(Varien_Event_Observer $observer)
{
    $event = $observer->getEvent();
    $post = $event->getControllerAction()->getRequest()->getPost();

    // Check Honeytrap is empty
    if (Zend_Validate::is( trim($post['fname']) , 'NotEmpty')) 
    {
        $customerHelper = Mage::helper('customer');
        $error = $customerHelper->__('A problem has occured with your registration.');
        Mage::getModel('customer/session')->addError($error);

        Mage::app()->getResponse()
            ->setRedirect(Mage::getUrl('customer/account', array('_secure' => true)))
            ->sendResponse();
        exit;
    }
}

これでconfig.xml

    <events>
        <controller_action_predispatch_customer_account_createpost>
            <observers>
                <mystore_honeytrap_observer>
                    <type>singleton</type>
                    <class>Mystore_Honeytrap_Model_Observer</class>
                    <method>check_trap</method>
                </mystore_honeytrap_observer>
            </observers>
        </controller_action_predispatch_customer_account_createpost>
    </events>
4

1 に答える 1

3

これを処理するためのより分離された方法は、関連するコントローラーアクション(controller_action_predispatch_*)の前にオブザーバーを登録して、フォームフィールドにデータが入力されているかどうかを検出し、入力されている場合は、ネイティブアクションがリクエストを処理しないようにリダイレクトすることです。

于 2012-04-18T22:13:19.323 に答える