0

I'm working with Laravel 5.5 and I'm trying to make validation of a form which shouldn't pass if user write html entities, for example: <h1>Hola</h1>, <script>alert(1)</script>. But it insert all field in DB.

My controller:

protected function storeForm(CaseRequest $request){
try {
$supportCase = new SupportCase;
$supportCase->type = $request->input('type');
// all fields of table[...]
$supportCase->save();

return view('steps/finish/success')->with(['message' => 'Form success']);
} catch (Exception $e) {
          echo $e->getMessage();
          return view('steps/finish/error')->withErrors(['message' => 'Form error']);
      }
}

My CaseRequest is this:

 /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
          'type' => 'required|min:3|max:3|string',
          'brand' => 'required|string',
          'product' => 'required|string',
          'order' => 'required|string',
          'description' => 'required|min:10|string',
          'sn' => 'nullable',
          'name' => 'required|min:2|string',
          'nin' => 'required|min:9|max:11|alpha_dash',
          'email' => 'required|email',
          'phone' => 'required|digits_between:7,12',
          'address' => 'required|min:5|string',
          'city' => 'required|min:2|string',
          'zip' => 'required|min:2|numeric',
          'state' => 'required|min:2|string',
          'country' => 'required|min:2|string',
        ];
    }

I have read the documentation and the Request is the first to be called, before than controller, and if this has any error it throw a error message. Doesn't it?.

I'm using parsley and select2, at first it has a validation in frontend with parley, and it's working well, but if I remove parsley validation now Laravel should validate it, right? but in my DB it is saving all fields (included<script>alert(1)</script>).

    <div class="form" id="main-form" data-parsley-validate="data-parsley-validate">
        {!! Form::open(['id' => 'main-form', 'data-parsley-validate' => 'data-parsley-validate']) !!}

        <div class="col-md-7 light-form">
            <fieldset>
                {!! Form::label('contact', trans('frontend/steps.form.contact'), ['class' => 'upper']) !!}
                {!! Form::label('name',  trans('frontend/steps.form.name')) !!}
                {!! Form::text('name', old('name'), [
                                                    'data-parsley-pattern' => '[ÁÉÍÓÚáéíóúa-zA-Z ]+$',
                                                    'data-parsley-required' => 'true',
                                                    'data-parsley-minlength'=>'2',
                                                    'data-parsley-required-message' => trans('frontend/steps.form-errors.name'),
                                                    'data-parsley-minlength-message' => trans('frontend/steps.form-errors.name'),
                                                    'data-parsley-pattern-message' => trans('frontend/steps.form-errors.name'),

                                                    ]) !!}
            </fieldset>
            <fieldset>
                {!! Form::label('nin',  trans('frontend/steps.form.in')) !!}
                {!! Form::text('nin', old('nin'), [
                                                  'data-parsley-type'=>'alphanum',
                                                  'data-parsley-required' => 'true',
                                                  'data-parsley-minlength'=>'9',
                                                  'data-parsley-maxlength'=>'11',
                                                  'data-parsley-required-message' => trans('frontend/steps.form-errors.in'),
                                                  'data-parsley-minlength-message' => trans('frontend/steps.form-errors.in'),
                                                  'data-parsley-maxlength-message' => trans('frontend/steps.form-errors.in')
                                                  ]) !!}
            </fieldset>
            <fieldset>
                {!! Form::label('phone',  trans('frontend/steps.form.telf')) !!}
                {!! Form::text('phone', old('phone'), [
                'data-parsley-pattern' => '\d+$',
                                                  'data-parsley-required' => 'true',
                                                  'data-parsley-minlength'=>'7',
                                                  'data-parsley-maxlength'=>'12',
                                                  'data-parsley-required-message' => trans('frontend/steps.form-errors.telf'),
                                                  'data-parsley-minlength-message' => trans('frontend/steps.form-errors.telf'),
                                                  'data-parsley-maxlength-message' => trans('frontend/steps.form-errors.telf'),
                                                  'data-parsley-pattern-message' => trans('frontend/steps.form-errors.telf')
                                                  ]) !!}
            </fieldset>
            <fieldset>
                {!! Form::label('address',  trans('frontend/steps.form.address')) !!}
                {!! Form::text('address', old('address'), [
                        'data-parsley-pattern' => '^[ÁÉÍÓÚáéíóúa-zA-Z0-9-_ ]+$',
                        'data-parsley-required' => 'true',
                        'data-parsley-minlength'=>'5',
                        'data-parsley-pattern-message' => trans('frontend/steps.form-errors.address'),
                        'data-parsley-minlength-message' => trans('frontend/steps.form-errors.address'),
                        'data-parsley-required-message' => trans('frontend/steps.form-errors.address'),

                                                  ]) !!}
            </fieldset>

            <div class="col-md-12 no-padding">
                <div class="col-md-6 location-form">
                    <fieldset>
                        {!! Form::label('address',  trans('frontend/steps.form.city')) !!}
                        {!! Form::text('city', old('city'), [
                                                          'data-parsley-required' => 'true',
                                                          'data-parsley-minlength'=>'2',
                                                          'data-parsley-pattern' => '[ÁÉÍÓÚáéíóúa-zA-Z ]+$',
                                                          'data-parsley-minlength-message' => trans('frontend/steps.form-errors.city'),
                                                          'data-parsley-required-message' => trans('frontend/steps.form-errors.city'),
                                                          'data-parsley-pattern-message' => trans('frontend/steps.form-errors.city'),
                                                          ]) !!}
                    </fieldset>
                    <fieldset>
                        {!! Form::label('zip',  trans('frontend/steps.form.zip')) !!}
                        {!! Form::text('zip', old('zip'), [
                                                          'data-parsley-required' => 'true',
                                                          'data-parsley-minlength'=>'2',
                                                          'data-parsley-minlength-message' => trans('frontend/steps.form-errors.zip'),
                                                          'data-parsley-required-message' => trans('frontend/steps.form-errors.zip')
                                                          ]) !!}
                    </fieldset>
                </div>
                <div class="col-md-6 no-padding">
                    <fieldset>
                        {!! Form::label('state',  trans('frontend/steps.form.state')) !!}
                        {!! Form::text('state', old('state'), [
                                                          'data-parsley-pattern' => '[ÁÉÍÓÚáéíóúa-zA-Z ]+$',
                                                          'data-parsley-required' => 'true',
                                                          'data-parsley-minlength'=>'2',
                                                          'data-parsley-required-message' => trans('frontend/steps.form-errors.state'),
                                                          'data-parsley-minlength-message' => trans('frontend/steps.form-errors.state'),
                                                          'data-parsley-pattern-message' => trans('frontend/steps.form-errors.state'),
                                                          ]) !!}
                    </fieldset>
                    <fieldset>
                        {!! Form::label('country',  trans('frontend/steps.form.country')) !!}
                        {!! Form::text('country', old('country'), [
                                                          'data-parsley-required' => 'true',
                                                          'data-parsley-pattern' => '[ÁÉÍÓÚáéíóúa-zA-Z ]+$',
                                                          'data-parsley-minlength'=>'2',
                                                          'data-parsley-required-message' => trans('frontend/steps.form-errors.country'),
                                                          'data-parsley-minlength-message' => trans('frontend/steps.form-errors.country'),
                                                          'data-parsley-pattern-message' => trans('frontend/steps.form-errors.country'),
                                                          ]) !!}
                    </fieldset>
                </div>
            </div>

        </div>
        <div class="col-md-5 dark-form">
            <fieldset>
                {!! Form::label('order', trans('frontend/steps.form.order'), ['class' => 'upper']) !!}
                {!! Form::text('order', old('order'), [
                                                  'placeholder' => '123567',
                                                  'data-parsley-type' => 'digits',
                                                  'data-parsley-type-message' => trans('frontend/steps.form-errors.order_format'),
                                                  'data-parsley-required' => 'true',
                                                  'data-parsley-required-message' => trans('frontend/steps.form-errors.order')
                                                  ]) !!}
                <span class="loading style-2"></span>
            </fieldset>
            <fieldset id="brand-wrap">
                <label class="upper" for="brand">
                    {!!  trans('frontend/steps.form.brand') !!}
                    <img class="tip" title="{!! trans('frontend/steps.form.brand_tooltip') !!}"
                         src="{!! asset('assets/img/frontend/icons/info.png') !!}"/>
                </label>
                {!! Form::select('brand', $layout->brands->pluck('name', 'id'), old('brand'), [
                                                                                                'id'=> 'brand',
                                                                                                'class' => 'select2',
                                                                                                'data-parsley-required' => 'true',
                                                                                                'data-parsley-required-message' => trans('frontend/steps.form-errors.brand')
                                                                                                ])
                                                                                          !!}
                <span class="loading style-2"></span>
            </fieldset>
            <fieldset id="product-wrap">
                {!! Form::label('product', trans('frontend/steps.form.product'), ['class' => 'upper']) !!}
                {!! Form::select('product', ['null' => 'null'], old('product'), [
                                                                                'id'=> 'product_select',
                                                                                'class' => 'select2',
                                                                                'data-parsley-required' => 'true',
                                                                                'data-parsley-required-message' => trans('frontend/steps.form-errors.product')
                                                                                ])
                                                                          !!}
            </fieldset>
            <fieldset>
                {!! Form::label('description', trans('frontend/steps.form.problem'), ['class' => 'upper']) !!}
                {!! Form::textarea('description', old('description'), [
                                                'data-parsley-pattern' => '[áéíóúÁÉÍÓÚäëïöüÄËÏÖÜa-zA-Z0-9-_ ]+$',
                                                'data-parsley-minlength'=>'10',
                                                'data-parsley-required' => 'true',
                                                'data-parsley-type-message' => trans('frontend/steps.form-errors.problem'),
                                                'data-parsley-required-message' => trans('frontend/steps.form-errors.problem'),
                                                'data-parsley-minlength-message' => trans('frontend/steps.form-errors.problem'),
                                                'data-parsley-pattern-message' => trans('frontend/steps.form-errors.problem')
                                                  ]) !!}
            </fieldset>
            <fieldset id="serial-wrap">
                {!! Form::label('sn', trans('frontend/steps.form.serial')) !!}
                {!! Form::text('sn', old('sn'), [
                                                'id' => 'sn',
                                                'data-parsley-required' => 'false',
                                                'data-parsley-required-message' => trans('frontend/steps.form-errors.imei'),
                                                'data-parsley-lunhvalidator' => '15',
                                                'data-parsley-lunhvalidator-message' => trans('frontend/steps.form-errors.invalid-imei')
                                                ])
                                            !!}
            </fieldset>
            <fieldset>
                {!! Form::label('email',  trans('frontend/steps.form.email')) !!}
                {!! Form::email('email', old('email'), [
                                                  'data-parsley-type'=> 'email',
                                                  'data-parsley-required' => 'true',
                                                  'data-parsley-type-message' => trans('frontend/steps.form-errors.email'),
                                                  'data-parsley-required-message' => trans('frontend/steps.form-errors.email')
                                                  ]) !!}
            </fieldset>

            @if($case == "INC")
                <button class="upper" type="button" onclick="nextStep(this)" data-type="FORM" data-field="transaction"
                        data-next="eleventh" data-case="{!! $case !!}"
                        data-value="">{!! trans('frontend/steps.form.continue') !!}</button>
            @else
                <button class="upper" type="button" onclick="nextStep(this)" data-type="FORM" data-field="transaction"
                        data-next="fifth" data-case="{!! $case !!}"
                        data-value="">{!! trans('frontend/steps.form.continue') !!}</button>
            @endif
        </div>
        {!! Form::close() !!}
    </div>

4
  • 1
    Usually you don't care about saving HTML in your database, just escape it when outputting. (Laravel does it by default with {{ $var }}) Commented Sep 16, 2019 at 8:47
  • But I don't want to save HTML in my DB, because I will use this information. I thought Laravel was doing this Commented Sep 16, 2019 at 8:52
  • Can you post your form here ? Commented Sep 16, 2019 at 8:56
  • I included it in post Commented Sep 16, 2019 at 9:01

1 Answer 1

2

Validation doesn't change input data. It just ensures the input matches your defined rules.

Technically there is no need to remove HTML tags. They won't do any harm in the database and can be escaped when outputting with {{ $content }}.

If you don't want to save HTML in your database use strip_tags() on the relevant fields.
But don't rely on it to prevent XSS, escaping output is still necessary

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.