EC-CUBEでの開発を行っていると、LPなどから直接カートに商品を追加したいという要望はよく耳にします。CSRF対策のために正式なトークンを持ったフォーム以外からはデータの送信を受け付けないような仕組みになっており、この仕組みに引っかかるとCSRF token is invalidと言ったエラーが出力されます。

これを回避するための裏技がFormTypeで設定が可能なcsrf_protectionオプションです。※セキュリティは低下するのでご注意ください。

src/Eccube/Form/Type/AddCartType.phpを修正

それではLPなどからカートへの追加を可能にするため、AddCartTypeというクラスのオプションを変更します。下記のメソッドでcsrf_protectionのオプションをfalseにしてやります。

/**
 * {@inheritdoc}
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setRequired('product');
    $resolver->setDefaults([
        'csrf_protection' => false, // この行を追加
        'id_add_product_id' => true,
        'constraints' => [
            // FIXME new Assert\Callback(array($this, 'validate')),
        ],
    ]);
}

この変更を行うことでシステムがCSRF対策のトークンをチェックしないようになり、トークンを送信しなくても商品詳細ページなどと同様の情報を送信するだけでカートに追加が可能になります。

静的なHTMLページなどからでもカート追加ができるので便利ですが、セキュリティという意味では下がってしまうことを念頭に開発を行ってください。

csrf_protextionを解除しなくても、LPでAddCartTypeのフォームを利用して{{ form_widget(form._token) }}とトークンを動的に出力してやれば解決が可能です。