[请益] textarea中的html标签(emoji)

楼主: chris07 (chris)   2016-07-19 22:03:17
标题想很久不知道怎么下……
想请教各位前辈们,
小弟目前在做一个发表留言的功能,
目前希望能做到的就是纯文字 + 表情符号(emoji),
未来可能会有放图片连结然后产生预览,不过这不是现在需要做的范围。
环境是php + mysql
目前做到的是,可以辨识出直接输入emoji,会以unicode储存,
然后取出来的时候会用文字的方式显示。
问题点在于,我有找到一个js的插件,
可以让我在textarea里面输入例如“:smile:”,然后他会自动转成
这样子:“<span>...略...</span>”的HTML标签,
透过这个标签可以用CSS将APPLE emoji的"图片"显示出来。
然而,为了安全起见,我在储存textarea文字时,
已经将“<”、“>”、“/”...等字眼转存成HTML代码了,例如:“&lt;”
所以上面那个js插件会变成我在文字框输入:“:smile:”
结果显示在网页时,却如实显示“<span>...</span>”
不知道有没有办法只让这个插件的HTML标签可以顺利转换,
使用者输入的标签则一律如实显示?
附带一问,
因为小弟第一次写php网页,
不知道有没有什么比较安全的防止使用者在文字输入处做攻击?
目前作法是使用 $text = sub_replace("<", "&lt;", $text);
这样子,将几个特殊字符替换掉,
包括:<、>、\、&、\n、空白及双引号(")
不知道这样够不够安全……
简单整理一下问题:
1. 有没有什么办法可以让使用者输入特定的文字安全的存进数据库,
  并在取出时将该特定文字以HTML标签方式呈现,其他非特定文字
  则如实呈现?
2. 不知道是否有比单纯在存进数据库前把特殊字符replace掉更好的做法?
补充:
目前已改成在写入数据库前这样做:$text = htmlspecialchars($text);
然后会以ajax的方式,将文章用json格式丢回来,稍微测试过,
感觉上应该ok?(原本replace方式后来发现完全不行……)
第一次发文有点囉嗦,先感谢各位前辈的指导! <(_ _)>
作者: LPH66 (-6.2598534e+18f)   2016-07-20 04:35:00
设法让你的数据库里只存 :smile:, 然后显示时再透过插件问题 2 基本上就是 htmlspecialchars 没错
作者: GALINE (天真可爱CQD)   2016-07-20 13:16:00
不是在写入数据库前做 html 的 escape,是在显示 html的时候做 html 的 escape...不过其他就跟你想的差不多吧。另外是该存 :smile: 还是<img> 这有算喜好问题,有各自的优缺点
楼主: chris07 (chris)   2016-07-20 13:28:00
我让:smile:存进数据库后就顺利显示了 感谢escape的部份我会再试试看的 不知道存进前跟取出时做escape有差在哪里吗?
作者: GALINE (天真可爱CQD)   2016-07-20 15:19:00
如果要把讯息塞入 javascript 或信件或其他地方,事先escape 会让你没办法拿到你真正要的资料不管是 html 还是 sql,正确的 escape 时机点都是“要用之前的那一行”
作者: crossdunk (推嘘自如)   2016-07-20 17:38:00
用PDO ~
作者: u315521 (羊小弟)   2016-07-20 18:18:00
用pdo是否就可不用处理特殊字符
楼主: chris07 (chris)   2016-07-20 18:30:00
了解,感谢各位前辈。我是用PDO没错。另外我刚刚发现虽然htmlspecialchars在HTML不会出错,可是\n就会变成换行符号而不能直接显示...PDO主要是担心SQL injection的部份吧特殊字则是担心使用者直接输入html或script
作者: banqhsia (BEN)   2016-08-04 10:45:00
为啥不直接存 emoji 就好惹QQ (数据库用utf8mb4)

Links booklink

Contact Us: admin [ a t ] ucptt.com