开发者社区> 问答> 正文

php写的论坛,要怎么保留用户发帖文本的原有样式同时又能防注入呢?

要防注入就不得不对用户输入的文本进行过滤,比如去掉一些标签什么的再存进数据库,但是这样一来再显示用户发帖内容的时候,原有的格式就被破坏了,麻烦各位老手指点应该怎么做。我用的thinkphp框架,还有kindeditor的插件,用I方法获取数据之后,那些什么加粗斜体颜色或者换行空格就都被破坏了。

展开
收起
小旋风柴进 2016-03-10 09:28:51 2688 0
1 条回答
写回答
取消 提交回答
  • 富文本内容要替换掉js代码主要防止xss,不是防止注入,防注入参数化写数据库就好了,或者将单引号替换为实体对象
    在做一些网站(特别是bbs之类)时,经常会有充许用户输入html样式代码,却禁止脚本的运行的需求, 以达到丰富网页样式,禁止恶意代码的运行。
    当然不能用 htmlencode 和 htmldecode 方法,因为这样连基本的html代码会被禁止掉。
    我在网上搜索,也没有找到好的解决办法,倒是收集了一些脚本攻击的实例:

      1. 其它基本控件的 on...事件中的代码
    1. iframe 和 frameset 中载入其它页面造成的攻击
      有了这些资料后,事情就简单多了,写一个简单的方法,用正则表达式把以上符合几点的代码替换掉:
    -C#
    public string wipescript(string html) 
    { 
    system.text.regularexpressions.regex regex1 = new system.text.regularexpressions.regex(@"<script[\s\S]+</script *>",system.text.regularexpressions.regexoptions.ignorecase); 
    system.text.regularexpressions.regex regex2 = new system.text.regularexpressions.regex(@" href *= *[\s\S]*script *:",system.text.regularexpressions.regexoptions.ignorecase); 
    system.text.regularexpressions.regex regex3 = new system.text.regularexpressions.regex(@" on[\s\S]*=",system.text.regularexpressions.regexoptions.ignorecase); 
    system.text.regularexpressions.regex regex4 = new system.text.regularexpressions.regex(@"<iframe[\s\S]+</iframe *>",system.text.regularexpressions.regexoptions.ignorecase); 
    system.text.regularexpressions.regex regex5 = new system.text.regularexpressions.regex(@"<frameset[\s\S]+</frameset *>",system.text.regularexpressions.regexoptions.ignorecase); 
    html = regex1.replace(html, ""); //过滤<script></script>标记 
    html = regex2.replace(html, ""); //过滤href=javascript: (<a>) 属性 
    html = regex3.replace(html, " _disibledevent="); //过滤其它控件的on...事件 
    html = regex4.replace(html, ""); //过滤iframe 
    html = regex5.replace(html, ""); //过滤frameset 
    return html; 
    } 

    此方法输入可能包含脚本的html代码,返回则就是干净的代码了。

    c#中过滤html的正则表达式

    TempContent 表示包含有html的字符串; 
    
    TempContent = System.Text.RegularExpressions.Regex.Replace(TempContent,"<[^>]+>","");至少一个 
    
    TempContent = System.Text.RegularExpressions.Regex.Replace(TempContent,"<[^>]*>","");任意个 
    2019-07-17 18:56:49
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
PHP安全开发:从白帽角度做安全 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载