关于表单数据中含有英文双引号导致的一系列输入框数据错乱等

CarryYang 25天前 181

问题描述

提交的表单中含有带英文双引号,存储入数据库或从数据库读取后未进行转义。
导致后台的前端中要再次编辑/修改的相应页面无法正常显示正确的数据。

复现步骤

  1. 使用后台自带的test表生成crud
  2. 在“测试管理”中添加一条数据,标题的值为:How do you spell the word "across"?,填完所有的数据并确定。
  3. 点击刚添加的数据行上的编辑按钮编辑/修改刚添加的数据,发现标题文本框中的值是:How do you spell the word

BUG截图

image.png
△添加数据
image.png
△编辑数据
image.png
△发现问题
image.png
△查看源码
image.png
△数据库中的字段

安装启用插件列表

与插件是否启用无关

FastAdmin版本

1.0.0.20190111_beta

PHP版本

PHP 5.6.31 fpm-fcgi

运行环境

Apache 2.4.27

(已测试)详细环境
WAMP环境:Windows(windows7、window server系列、win10)+Apache 2.4.27+MySQL 5.7.19+PHP 5.6.31 fpm-fcgi
WIMP环境:Windows(windows7、window server系列、win10)+IIS 7(7.0、7.5)+MySQL 5.7.19+PHP 5.6.31 fpm-fcgi

其他环境/配置

image.pngimage.png

以此bug引申出的其他问题思考

FASTADMIN还可能出现的其他因表单中注入、填写了英文符号等造成其他严重错误,目前以我的思路想到的有:

  1. sql注入对安全的影响。百度百科-SQL注入
  2. sql注入绕过对安全的影响。csdn某某博客-临时找的,仅供参考
  3. 其他符号如英文单引号、尖括号等对程序的影响。
  4. html、js是否过滤、是否具有防xss攻击能力。
  5. 其他未发现的问题

可能有效的应对措施、解决方案。思路及建议

普通安全性:

  1. 对所有的表单都进行转义输入(存储)和(或)输出。或根据规则替换相应字符
  2. 添加更多的html、js、sql、xss过滤规则。

对于网站攻击防御:
参照ThinkPHP 5.0完全开发手册:

  1. 看云-thinkphp手册-输入安全,对不同的应用需求设置default_filter过滤规则。
  2. 看云-thinkphp手册-数据库安全,对于需要输出到页面的数据做好必要的XSS过滤。
  3. 看云-thinkphp手册-其他安全建议

最后的话

以上反馈,如有错误的地方,欢迎指正,本人会及时回来更正。
以上意见,仅本程序员愚见,如有不合内容的地方,也欢迎指正。也欢迎大神抬手补充。
路途遥远,希望FASTADMIN变得越来越好。开源万岁!

CarryYang,在职php全栈程序员一枚,有问题可以联系我的邮箱。
最近忙于一个在线英语水平测试系统发现以上问题,已经在项目中完成了小部分的修改。但好像这个工作量还挺大的。

最后艾特下老大,以寻求更高效、更完美的解决方案:@Karson @F4NNIU
感谢!


【重大安全性bug】

最后于 1天前 被F4NNIU编辑
最佳回复
  • 老妖怪 2天前

    image.png
    这个可以解决你的问题,配置文件:/application/config.php
    改后结果:
    image.png
    数据库:
    image.png
    但是会有新的问题,虽然文本框显示正确了,但是列表页却没有解析html,原样输出了,看下图:
    image.png

    原因分析可能是前端art-template把html代码重新编码了
    image.png
    前端水平有限,暂时不知道怎么解决

最新回复 (4)
  • CarryYang 楼主 25天前
    感谢TA
    0 引用 2

    @Karson @F4NNIU 如何从根源上解决?
    我目前是在视图中使用value="{$row.title|str_replace='"','"',###}"替换字符串来避免双引号对HTML的干扰。(str_replace)。
    但由于系统中使用了大量一键生成的CRUD,然后还自己修改了部分控制器逻辑,前端。视图那么多,改起来很难受啊(虽然通过一天的奋斗已经修改了不少代码)。
    如果是从php源码上来做,会不会对升级更加友好。比如R操作(读取数据并分配到模板)时都进行字符替换或转义。又比如C、U操作时进行字符替换或转义,然后再录入数据库?
    因为使用FASTADMIN上手时,都是使用中文在测试,最近有英文网站项目,所以发现了这个问题。

  • CarryYang 楼主 10天前
    感谢TA
    0 引用 3

    每当输出的时候,使用htmlspecialchars()将特殊字符转义为html实体也可以避免value属性被干扰的问题。就像这样:
    image.png
    使用了tp5的模板函数调用语法

    但如果,一个页面有很多很多类似会被英文双引号干扰解析的地方,都需要替换输出的话,就会产生大量修改源码的工作。
    目前还在寻求一个更好的解决办法,比如变量被assign到模板时就自动使用htmlspecialchars()函数。

  • 老妖怪 最佳回复 2天前
    感谢TA
    0 引用 4

    image.png
    这个可以解决你的问题,配置文件:/application/config.php
    改后结果:
    image.png
    数据库:
    image.png
    但是会有新的问题,虽然文本框显示正确了,但是列表页却没有解析html,原样输出了,看下图:
    image.png

    原因分析可能是前端art-template把html代码重新编码了
    image.png
    前端水平有限,暂时不知道怎么解决

  • CarryYang 楼主 2天前
    感谢TA
    0 引用 5
    老妖怪 ![image.png](//cdn.forum.fastadmin.net/uploads/201902/21/ae558df17010558e5fbd823a7fb1b445) 这个可以解决你的 ...

    我的问题已经解决了,只是最近比较忙,没有来逛贴子。
    对于列表页内容(表格内容)未转义的问题,可以这样解决:设置了全局过滤规则之后,修改 /public/assets/js/require-table.js 里的参数: escape: false, //是否对内容进行转义 。表格里就可以正常显示了。

    至于过滤的问题,我了解了一下,在ThinkPHP5.0中,并没有一劳永逸的办法
    但有如下几套武功可以修炼:
    1、将ThinkPHP默认全局过滤设置为htmlspecialchars,这样提交的数据都会使用php的htmlspecialchars()函数过滤,那么数据库中就存的是过滤后的字符。前台输出时正常在模板中输出就可以。
    另外修改 /public/assets/js/require-table.js 里的参数: escape: false, //是否对内容进行转义 。表格里就可以正常显示了。
    目前这样做有很多缺点:
    一是对json字符串不友好,提交json数据字符串时,["aaa":"aaa","bbb":"bbb"] 里的英文双引号被解析。造成系统设置-字典设置,插件配置里的字典,依赖json数据字典的前端组件等无法正常decode数据,若是将每一处需要原样输出json的地方代码改为先htmlspecialchars_decode()再输出,无疑会增加巨大的工作量。(而且客户要求提供接口,以便后期开发java程序可以使用数据库中的json数据字符串,设置了htmlspecialchars的话,后果很感人,那就是输出数据的时候还是要转回来)
    二是对无害HTML标签不友好,例如content文章字段中如果使用编辑器上传了图片,那么前端直接输出时,不会显示图片,而是显示<img>标签。,若是将每一处需要原样输出json的地方代码改为先htmlspecialchars_decode()再输出,无疑会增加巨大的工作量。
    但这样做可以保证有更好的安全性且能够正常运行,程序员嘛,要的就是成就感,有点挑战性也没什么不可。

    2、不启用全局过滤。控制模板输出,模板中输出标签时,在可能会遇到有害字符的变量输出时,使用htmlspecialchars()函数,应需而用。
    这样做的缺点:安全性可能相对更差。
    但ThinkPHP有字段验证,我怕个卵的安全性差不差,好用就行了。何况在设计程序时,有大量的内容要使用json格式存/取,转义然后逆转义的代价太大。

    不过在ThinkPHP5.1中,已经有模板变量输出时的转义及过滤了,但是至于具体是什么学名或是怎样的功能我没有深入了解了。打算将这个项目一阶段开发结束之后就放弃在其他项目上使用FASTADMIN了,或者说是放弃使用5.0版本的TP。
    我是一个php全栈工程师,因为在我使用的过程中,这些工具带来了很大的便利,但有很多地方又不太适合较为复杂的项目。比如出了bug之后,独自修复所需要的大量工程量,需要查阅大量的工具书。若一个项目急于完成初级阶段的开发,并要求降低bug产生率然后上线的话,对于全栈来说无疑是巨大压力。
    稍后呢,可能会开始使用TP5.1,Laravel,Yii等框架。或者抽时间参考优秀框架写一套轻量级的框架。但我想最好我还是会先站在巨人的肩膀上,因为一个人要想成为巨人的话总要先知道巨人是怎样的。
    总之做开发工作,没有一劳永逸这一说,想要不断地得到什么、不断地成长,就只有不断地开拓眼界,更新知识,做出新功能,写bug然后修复bug。与各位攻城狮共勉,争取早日变得强大然后进化,赢取白富美,走上装逼巅峰。

  • 未登录
    6
返回