Laravel截断具有特殊字符的字符串

时间:2017-08-18 17:18:14

标签: mysql laravel special-characters truncate htmlspecialchars

我已经在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'处被截断,该'%3F'应该替换为'?'或者至少保持不变。

我知道这些都是安全措施,但我已经调整了很多前编辑器,我认为后端卫生应该留给我(如果我想的话)我想要的方式。我真的需要先了解如何在获得最佳实践建议之前停止这种烦人的行为。我希望字符串能够以无需任何更改的方式进入数据库。提前致谢。

1 个答案:

答案 0 :(得分: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>";
}

<强>结果

当我提交您的代码时,我可以在浏览器的“网络”标签中看到它不变“

enter image description here

然后我转到数据库并看到代码也未改变。

enter image description here

含义是什么

不幸的是,我无法重复你在这里提出的错误。这意味着Laravel不会意外地转换您的代码。尝试检查网络标签和dd()请求变量以检查它们。我想这个错误是在通过网络发送数据之前的某个地方。