mivita/resources/views/web/templates/registrierung.blade.php
Kevin Adametz 4c944aa15d Spamschutz Kontakt + Registrierung: Turnstile, Rate-Limit, Honeypot; Passwort min. 8
- Kontaktformular: keine Mail mehr an die eingegebene Adresse (wurde als
  Spam-Versender missbraucht); Anfrage nur an Kontakt-Adresse + Berater (BCC),
  Reply-To = Absender; Eingaben in der Mail escaped
- Kontakt + Registrierung: Cloudflare Turnstile statt reCAPTCHA (Schluessel
  aus dem Code in die .env), Rate-Limits, Honeypot + Mindest-Ausfuellzeit,
  Namensregel (lateinische Schrift, max. 50 Zeichen), Form Requests
- Registrierung: Partner-Nummer nur fuer aktive Berater (vorher ungeprueft)
- CRM: POST /register abgeschaltet (legte ohne Captcha Benutzer an)
- Passwort-Mindestlaenge systemweit 8 Zeichen ueber Password::defaults()
- Log abgefangener Anfragen: storage/logs/form-spam-*.log
- Doku und Protokoll: dev/2026-10-09-spam/README.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 08:22:02 +00:00

222 lines
No EOL
10 KiB
PHP

@extends($user_shop ?'web.user.layouts.layout' : 'web.layouts.layout')
@section('content')
<section class="page-header page-header-xlg parallax parallax-3"
style="background-image:url('assets/images/vision-min.jpg')">
<div class="overlay dark-1"><!-- dark overlay [1 to 9 opacity] --></div>
<div class="container">
</div>
</section>
<style>
.checkbox.error{
color:#b92c28 !important;
}
</style>
<style type="text/css">
.tp-caption {
text-shadow: none;
}
div.shop-item {
margin-bottom: 30px;
border: 1px solid #ddd;
}
div.shop-item > .thumbnail, .thumbnail {
border: none;
}
div.shop-item-summary {
padding: 8px;
}
div.shop-item-summary h2 a {
color: #9aa983;
font-size: 1.2em;
margin: 0 0 10px 0;
}
div.shop-item-buttons {
padding: 0 8px 10px 8px;
}
div.shop-item-buttons .btn-xs {
padding: 4px;
}
img.avatar {
width: 75%;
max-width: 200px;
border: 6px solid #bbccab;
margin-bottom: 10px;
}
.radio, .checkbox {
font-size: 14px;
line-height: 1.3em;
}
.checkbox i {
top:1px;
}
.alert.error {
padding: 8px;
margin-bottom: 4px;
margin-top: 4px;
font-size: 0.9em;
font-weight: bold;
}
select.form-control:not([size]):not([multiple]) {
height: 40px;
}
</style>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<section>
<div class="container">
<div class="row">
<!-- FORM -->
<div class="col-md-9 col-sm-8">
<h1>{{ trans('register.reg_hl') }}</h1>
<p>{{ trans('register.reg_line_1') }}</p>
<div class="box-static box-transparent box-bordered padding-20">
{!! Form::open(['action' => '/registrierung']) !!}
{{ html()->hidden(\App\Services\FormSpamGuard::TIMESTAMP_FIELD, $form_token) }}
<div style="position: absolute; left: -10000px; top: auto; width: 1px; height: 1px; overflow: hidden;" aria-hidden="true">
<label for="{{ \App\Services\FormSpamGuard::HONEYPOT_FIELD }}">{{ __('form_protection.honeypot_label') }}</label>
{{ html()->text(\App\Services\FormSpamGuard::HONEYPOT_FIELD)->attributes(['tabindex' => '-1', 'autocomplete' => 'off']) }}
</div>
@if(isset($from_member_id))
{!! Form::hidden('from_member_id', $from_member_id) !!}
@endif
<div class="text-right" style="margin-bottom: 8px; margin-top: -16px;">
<em class="small">* {{trans('register.required_fields')}}</em>
</div>
<div class="row contact-row">
<div class="form-group col-md-12">
{!! Form::label('salutation', __('Salutation').'*') !!}
{!! Form::select('salutation', [''=>__('please select'), 'mr'=>__('MR'), 'ms'=>__('MS')], '', ['class' => 'form-control '.($errors->has('salutation') ? 'error is-invalid' : '')]) !!}
@if ($errors->has('salutation'))
<div class="alert alert-danger error"><!-- DANGER -->
{{ $errors->first('salutation') }}
</div>
@endif
</div>
<div class="form-group col-md-6">
{!! Form::label('first_name', __('First name').'*') !!}
{!! Form::text('first_name', '', ['class' => 'form-control '.($errors->has('first_name') ? 'error is-invalid' : ''), 'placeholder'=>__('First name'), '']) !!}
@if ($errors->has('first_name'))
<div class="alert alert-danger error"><!-- DANGER -->
{{ $errors->first('first_name') }}
</div>
@endif
</div>
<div class="form-group col-md-6">
{!! Form::label('last_name', __('Last name').'*') !!}
{!! Form::text('last_name', '', ['class' => 'form-control '.($errors->has('last_name') ? 'error is-invalid' : ''), 'placeholder'=>__('Last name'), '']) !!}
@if ($errors->has('last_name'))
<div class="alert alert-danger error"><!-- DANGER -->
{{ $errors->first('last_name') }}
</div>
@endif
</div>
<div class="col-md-12"> <hr> </div>
<div class="form-group col-md-12">
{!! Form::label('email', __('E-Mail Address').'*') !!}
{!! Form::email('email', '', ['class' => 'form-control '.($errors->has('email') ? 'error is-invalid' : ''), 'placeholder'=>__('E-Mail Address'), '']) !!}
@if ($errors->has('email'))
<div class="alert alert-danger error"><!-- DANGER -->
{{ $errors->first('email') }}
</div>
@endif
</div>
<div class="form-group col-md-12">
{!! Form::label('email-confirm', __('Confirm E-Mail Address').'*') !!}
{!! Form::email('email-confirm', '', ['class' => 'form-control '.($errors->has('email-confirm') ? 'error is-invalid' : ''), 'placeholder'=>__('Confirm E-Mail Address'), '']) !!}
@if ($errors->has('email-confirm'))
<div class="alert alert-danger error"><!-- DANGER -->
{{ $errors->first('email-confirm') }}
</div>
@endif
</div>
<div class="col-md-12"> <hr> </div>
<div class="form-group col-md-12">
{!! Form::label('password', __('Password').'*') !!}
{!! Form::password('password', ['class' => 'form-control '.($errors->has('password') ? 'error is-invalid' : ''), 'placeholder'=>__('Password'), '']) !!}
@if ($errors->has('password'))
<div class="alert alert-danger error"><!-- DANGER -->
{{ $errors->first('password') }}
</div>
@endif
</div>
<div class="form-group col-md-12">
{!! Form::label('password_confirmation', __('Confirm Password').'*') !!}
{!! Form::password('password_confirmation', ['class' => 'form-control '.($errors->has('password_confirmation') ? 'error is-invalid' : ''), 'placeholder'=>__('Confirm Password'), '']) !!}
@if ($errors->has('password_confirmation'))
<div class="alert alert-danger error"><!-- DANGER -->
{{ $errors->first('password_confirmation') }}
</div>
@endif
</div>
<div class="col-md-12">
<hr>
</div>
<div class="col-md-12" style="margin-bottom: 8px; margin-top: 8px;">
<label class="checkbox {{ ($errors->has('accepted_data_protection') ? 'error' : '') }}" for="accepted_data_protection">
{!! Form::checkbox('accepted_data_protection', 1, false, ['id'=>'accepted_data_protection', 'class' => 'form-control '.($errors->has('accepted_data_protection') ? 'error' : ''), '']) !!}
<i></i> <span class="fa fa-angle-double-left text-success fa-lg"></span>
{!! trans('register.reg_checked', ['link' => url('datenschutz')]) !!}
.*
</label>
@if ($errors->has('accepted_data_protection'))
<div class="alert alert-danger error"><!-- DANGER -->
{{ $errors->first('accepted_data_protection') }}
</div>
@endif
</div>
</div>
<div class="row contact-row">
<div class="col-md-12">
<div class="cf-turnstile" data-sitekey="{{ $turnstile_site_key }}" data-action="register" data-language="{{ app()->getLocale() }}"></div>
@if ($errors->has('cf-turnstile-response'))
<div class="alert alert-danger error"><!-- DANGER -->
{{ $errors->first('cf-turnstile-response') }}
</div>
@endif
</div>
</div>
<button type="submit" class="btn btn-primary btn-text-500"><i class="fa fa-check"></i> {{ __('website.register_now') }} </button>
{!! Form::close() !!}
</div> <!-- end col -->
<!-- /FORM -->
</div>
<!-- INFO -->
@include('web.templates._side_contact')
</div>
</div>
</section>
<!-- / -->
@endsection