设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 站长学院 > PHP教程 > 正文

分析在PHP中显示格式化的用户输入

发布时间:2022-06-28 09:12 所属栏目:121 来源:互联网
导读:你可以在这个页面下载这个文档附带的文件,也可以在文件下载中的字符处理中下载这个文档描述如何安全显示的有格式的用户输入。我们将讨论没有经过过滤的输出的危险,给出一个安全的显示格式化输出的方法。 没有过滤输出的危险 如果你仅仅获得用户的输入然后
  你可以在这个页面下载这个文档附带的文件,也可以在文件下载中的字符处理中下载这个文档描述如何安全显示的有格式的用户输入。我们将讨论没有经过过滤的输出的危险,给出一个安全的显示格式化输出的方法。
 
  没有过滤输出的危险

  如果你仅仅获得用户的输入然后显示它,你可能会破坏你的输出页面,如一些人能恶意地在他们提交的输入框中嵌入javascript脚本:
 
  This is my comment.
 
  <script language="javascript:
 
  alert('Do something bad here!')">.
 
  这样,即使用户不是恶意的,也会破坏你的一些HTML的语句,如一个表格突然中断,或是页面显示不完整。
 
  只显示无格式的文本
 
  这是一个最简单的解决方案,你只是将用户提交的信息显示为无格式的文本。使用htmlspecialchars()函数,将转化全部的字符为HTML的编码。
 
  如<b>将转变为,这可以保证不会有意想不到的HTML标记在不适当的时候输出。
 
  这是一个好的解决方案,如果你的用户只关注没有格式的文本内容。但是,如果你给出一些可以格式化的能力,它将更好一些。
 
  Formatting with Custom Markup Tags
 
  用户自己的标记作格式化
 
  你可以提供特殊的标记给用户使用,例如,你可以允许使用...加重显示,...斜体显示,这样做简单的查找替换操作就可以了: output = str_replace("", "<b>", output);
 
  output = str_replace("", "<i>", output);
 
  再作的好一点,我们可以允许用户键入一些链接。例如,用户将允许输入[link="url"]...[/link],我们将转换为<a href="">...</a>语句
 
  这时,我们不能使用一个简单的查找替换,应该使用正则表达式进行替换:
 
  output = ereg_replace('/[link="([[:graph:]] )"/]', '<a href="//1">', output);
 
  ereg_replace()的执行就是:
 
  查找出现[link="..."]的字符串,使用<a href="..."> 替换它
 
  [[:graph:]]的含义是任何非空字符,有关正则表达式请看相关的文章。
 
  在outputlib.php的format_output()函数提供这些标记的转换,总体上的原则是:
 
  调用htmlspecialchars()将HTML标记转换成特殊编码,将不该显示的HTML标记过滤掉,然后,将一系列我们自定义的标记转换相应的HTML标记。

  一些注意的地方:
 
  记住替换自定义标记生成HTML标记字符串是在调用htmlspecialchars()函数之后,而不是在这个调用之前,否则你的艰苦的工作在调用htmlspecialchars()后将付之东流。
 
  在经过转换之后,查找HTML代码将是替换过的,如双引号"将成为"
 
  nl2br()函数将回车换行符转换为<br>标记,也要在htmlspecialchars()之后。
 
  当转换[links=""] 到 <a href="">, 你必须确认提交者不会插入javascript脚本,一个简单的方法去更改[link="javascript 到 [link=" javascript, 这种方式将不替换,只是将原本的代码显示出来。
 
  outputlib.php
 
  在浏览器中调用test.php,可以看到format_output() 的使用情况
 
  结论
 
  这个讨论提供安全显示用户输入的方法,可以使用在下列程序中
 
  留言板
 
  用户建议
 
  系统公告
 
  BBS系统。
 
 

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读