Today most popular approach is to place captcha code on form to verify, that humans (not search engines) are submitting site forms. More dirty captcha image is, more chances are spider/bot won't be able to recognize it. On the other hand it makes form submitting uncomfortable for users. Also captcha is used only on forms, when user is not logged in.
Here is approach, that is not using captcha, but still provides same level of protection:
- after page with form is loaded, then send ajax request to server
- in ajax response send random name and random value + save both to session
- when ajax response is received, then dynamically add hidden field with received name and value
- when form is submitted, then check, that submitted value matches generated one from session
We are generating random hidden field name to allow same form to be submitted from different tabs of same browser, when we have same user session.