#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. Всегда пожалуйста.