Компонент лезвия Laravel — Проблема с кодировкой UTF-8

#php #laravel #encoding

Вопрос:

В настоящее время я работаю над приложением с версией Laravel 8. Я создал компонент с именем input-group , который вызывает проблемы с кодированием, которые я не понимаю. Код компонента выглядит следующим образом :

 <div class="form-group" {{ isset($attributes['style']) ? $attributes->merge(['style' => $attributes['style']]) : null }}>
    @if(isset($attributes['label']))
        <label for="{{ $attributes['id'] }}">{{ $attributes['label'] }}</label>
        <input type="text" 
               value="{{ isset($attributes['value']) ? $attributes['value'] : null }}" 
               class="form-control form-control-sm" 
               name="{{ $attributes['name'] }}" 
               id="{{ $attributes['id'] }}" 
               placeholder="{{ isset($attributes['placeholder']) ? $attributes['placeholder'] : null }}">
    @else 
        <input style="width:100%;" type="text" value="{{ isset($attributes['value']) ? $attributes['value'] : null }}" class="form-control form-control-sm" name="{{ $attributes['name'] }}" id="{{ $attributes['id'] }}" placeholder="{{ isset($attributes['placeholder']) ? $attributes['placeholder'] : null }}">
    @endif
  </div>
 

Вот данные, которые я value вводлю в атрибуты => Inspecteur de l'Education Nationale

И вот результат, который я получил в своем <input> : Inspecteur de lamp;#039;Education Nationale

Я уточняю, что моя БД (с использованием MySQL) имеет кодировку Laravel по умолчанию utf8mb4_unicode_ci . Запрос, который я использую для получения этих данных, является классическим красноречивым запросом (я не манипулирую кодировкой).

Конфигурация драйвера mysql выглядит следующим образом :

         'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
 

Комментарии:

1. Это не проблема с кодировкой UTF-8. Скорее всего, прежде чем он будет сохранен в базе данных, его очистят с помощью чего-то вроде htmlspecialchars

Ответ №1:

{!! !!} будет работать, но я бы не стал использовать его здесь.

Особенно если значение, которое вы визуализируете, может быть задано пользователем, поскольку оно не определено. Это потенциальная уязвимость, и вы оставляете себя открытым для атак XSS.

Вместо этого вы можете сделать:

{{ html_entity_decode($value) }} , вы по-прежнему получаете преимущество blade, помогающего предотвращать атаки XSS.

Вы можете прочитать больше об этой функции here:https://www.php.net/manual/en/function.html-entity-decode.php.

Комментарии:

1. в моем случае это не работает…

Ответ №2:

Используйте {!! !!} вместо {{ }}

Т. е. :

value="{!! isset($attributes['value']) ? $attributes['value'] : null !!}"

Отображение Неэкранированных Данных

По умолчанию {{ }} операторы Blade автоматически отправляются через htmlspecialchars функцию PHP для предотвращения XSS-атак.

Комментарии:

1. спасибо, Стивен, это отлично работает 🙂

2. Всегда пожалуйста.