Laravel усекает строки со специальными символами

Я работаю над CMS уже несколько месяцев, я столкнулся с различными проблемами, когда laravel усекает определенные специальные символы. Мне пришлось изменить редактор в CMS с bootstrap wysiwyg на ckeditor, все стало намного лучше, поскольку с ним поставляются некоторые дополнительные параметры экранирования. Например, мне удалось предотвратить превращение '"' в '", что приводило к усечению всей строки (абзаца) везде, где она находила такую ​​кодировку.

Однако это CMS, где у пользователя есть веская причина вводить широкий диапазон символов, которые можно безопасно закодировать и сохранить в базе данных в тех случаях, когда неизбежны специальные символы. Например, выбор встраивания с веб-сайта (очень разрешено), который может содержать любой из этих символов;

/ = %2F 
: = %3A
# = %23
% = %25
? = %3F

Когда кто-то вставляет ссылку, содержащую определенные символы, или пытается создать гиперссылку на некоторые слова, содержащие символы, подобные приведенным выше (за исключением %2F), строка усекается. Проведя проверку на разных уровнях, я заметил, что строка успешно попадает во внутреннюю функцию, а затем усекается перед сохранением. Я не знаю, усекает ли эти строки его Laravel (парсер) или MySql (база данных, которую я использую). Вот частный случай;

Когда это встраивается в Facebook:

<iframe src="https://www.facebook.com/plugins/comment_embed.php?href=https%3A%2F%2Fwww.facebook.com%2Ftonyelumelu%2Fposts%2F10154627801036949%3Fcomment_id%3D10154629134011949&include_parent=false" width="560" height="201" style="border:none;overflow:hidden"
  scrolling="no" frameborder="0" allowTransparency="true">
</iframe>

Вставил в редакторе вот что нашел в базе

<iframe src="https://www.facebook.com/plugins/comment_embed.php?href=https://www.facebook.com/tonyelumelu/posts/10154627801036949?comment_id=10154629134011949

Внимательное наблюдение покажет вам, что все '%2F' были заменены в строке на '/', но строка была точно усечена до '%3F', который должен был быть заменен на '?' или, по крайней мере, оставлен без изменений.

Я знаю, что это меры безопасности, но я уже много настроил передний редактор, и я думаю, что санация задней части должна быть предоставлена ​​мне, чтобы я мог сделать это (если я хочу) так, как я хочу. Мне действительно нужно сначала узнать, как остановить такое раздражающее поведение, прежде чем давать советы по передовой практике. Я просто хотел бы, чтобы строки попадали в базу данных в том виде, в каком они приходят, без каких-либо изменений. Заранее спасибо.


person Fenn-CS    schedule 18.08.2017    source источник
comment
Я только что проверил, когда я сохраняю html-код, я вижу, что он правильно сохранен в базе данных. Похоже, это проблема вашего редактора.   -  person shukshin.ivan    schedule 18.08.2017
comment
@shukshin.ivan вы должны отправить данные с помощью формы (запрос laravel) или передать данные в URL-адресе. Это было бы вполне конкретно. Я проверил данные, собранные в редакторе, и их полноту в интерфейсе. Так что все, что происходит, должно быть на бэкэнде   -  person Fenn-CS    schedule 19.08.2017
comment
Как вы можете видеть в моем ответе, теперь я передаю данные с помощью формы. Попытайся.   -  person shukshin.ivan    schedule 20.08.2017


Ответы (1)


Попытка повторить ошибку

Я создаю тестовый маршрут Route::any('/test', 'IndexController@test')->name('test');

Затем - тестовое действие:

public function test(Request $request) {
    if($request->isMethod('post')) {
        $er = \App\Entity::create([
            'log' => $request->code,
        ]);


        exit('done');
    }

    echo "<form method=post>" . csrf_field() . 
         "<textarea name=code></textarea><input type=submit></form>";
}

Результаты

Когда я отправляю ваш код, я вижу его без изменений на вкладке «Сеть» в браузере.

введите здесь описание изображения

Затем я захожу в базу данных и также вижу неизмененный код.

введите здесь описание изображения

Что это значит

К сожалению, мне не удалось повторить ошибку, которую вы здесь представили. Это означает, что это не Laravel неожиданно преобразует ваш код. Попробуйте проверить вкладку «Сеть» и dd() запросить переменные, чтобы проверить их. Я предполагаю, что ошибка где-то перед отправкой данных по сети.

person shukshin.ivan    schedule 19.08.2017
comment
Спасибо за ваше время! Вы правы, проблема была на переднем конце. Если вы хотите знать, что пошло не так во внешнем интерфейсе, мы идем сюда: «javascript усекает строку во время конкатенации»> stackoverflow.com/questions/46269141/ - person Fenn-CS; 19.09.2017