О защите от спама для любого сайта используя Javascript я уже писал . В этой заметке речь пойдёт о том, как вышеупомянутое решение использовать в проекте на Yii2 без лишних заморочек. Принцип тот же, за исключением некоторых нюансов, относящихся к идеологии фреймворка фреймворка Yii2 .

Защита от спама в Yii2 на примере контактной формы:

1) Добавляем в форму (файл вида):

<?= $form->field($model, 'check')->hiddenInput([
	'type' => 'hidden',
	'id' => 'check',
	'value' => '',
])->label(false) ?>

2) Приводим кнопку формы в такой вид:

<div class="form-group">
<?= Html::submitButton('ОТПРАВИТЬ', [
	'id' => 'btn-contact',
	'class' => 'btn btn-site',
	'name' => 'contact-button',
	'onclick'=>"document.getElementById('check').value = 'nospam';"
]) ?>
</div>

Полностью форма будет иметь следующий вид:

<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>
	<?= $form->field($model, 'name')->textInput(['autofocus' => true]) ?>
	<?= $form->field($model, 'email') ?>
	<?= $form->field($model, 'subject') ?>
	<?= $form->field($model, 'body')->textarea(['rows' => 6]) ?>
	<?= $form->field($model, 'verifyCode')->widget(Captcha::class, [
		'template' => '<div class="row"><div class="col-lg-6">{image}</div><div class="col-lg-6">{input}</div></div>',
	]) ?>
	<?= $form->field($model, 'check')->hiddenInput([
		'type' => 'hidden',
		'id' => 'check',
		'value' => '',
	])->label(false) ?>
	<div class="form-group">
	<?= Html::submitButton('ОТПРАВИТЬ', [
		'id' => 'btn-contact',
		'class' => 'btn btn-site',
		'name' => 'contact-button',
		'onclick'=>"document.getElementById('check').value = 'nospam';"
	]) ?>
	</div>
<?php ActiveForm::end(); ?>

В метод отправки формы (в соответствующем контроллере) добавляем ещё одно условие $_POST["ContactForm"]["check"] === 'nospam':

if ($form->load(Yii::$app->request->post()) && $form->validate() && $_POST["ContactForm"]["check"] === 'nospam'):
	// Отправляем форму
	return $this->refresh();
endif;