显示格式化的用户输入

林继 PHP 技术 7,217 共写了1481个字 (2006-12-09 9:48:26) 没有评论 打印 扫描二维码 百度已收录

From:http://www.vuu.cn/article/vuu.asp?item=14421

  此文档描述了如何根据用户的输入安全地显示格式化输出。我们将讨论显示未经过滤的输出的危险性,然后提出一个显示格式化输出的安全的方法。

未过滤输出的危险性

  如果你只是简单地得到用户的输入,并且原封不动地将它们显示出来,那样就可能会破坏你的网页。例如,某些别有用心的人可能在他们的注解中嵌入javascript脚本,如:

  这是我的注解。

  1. <script language="javascript: alert('在这里做一些不好的事情!')">

  即使用户没有什么不良企图,他们也有可能碰巧输入了一些html代码,破坏页面的布局。例如,你在一个表格中显示用户的输入,当用户输入中包括了一个错误嵌套的

  1. </table>

标记,页面显示就被破坏了。

只显示无格式文本

  最简单的解决方法应该是只在注解中显示无格式文本。使用htmlspecialchars() 函数,可以将所有的特殊字符转换成html特殊字符。例如将变成

  1. <b>

,转换为html标记的文本表示。这就保证了在注解中没有html标记,从而不会产生不希望的输出。

  如果你的访客不介意只是输入无格式文本,这个方法就很好,但是如果你能够提供给他们一些格式化的功能则就更好了。

使用自定义标记进行格式化

  为了实现格式化输出可以为用户提供自已定义的特殊标记。比如可以允许用户使用

  1. [b]...[/b]

来表示黑体设置,…表示斜体设置。可以对它们进行简单的字符串替换操作:

  1. $output = str_replace("[b]", "<b>", $output); 
  2. $output = str_replace("[i]", "<i>", $output);

  做得再好一点,允许用户可以加入链接。例如,用户可以在

  1. [link="url"]...[/link]

中输入链接,我们将把它转变成合适的

语句。这里不能只使用简单地字符替换,需要使用正则表达式:

  1. $output = ereg_replace('\[link="([[:graph:]]+)"\]', '<a href="\\1">', $output);

  如果你对ereg_replace()函数不熟悉的话,这句话的意思就是:查找所有
[link=”…”]
出现的地方,将其替换成为

  1. <a href="...">

[[:graph:]]表示任意非空字符。请查阅手册中的关于正则表达式的详细内容。

引用
ereg_replace
(PHP 3, PHP 4, PHP 5)

ereg_replace — 替换正则表达式
说明
string ereg_replace ( string pattern, string replacement, string string )

本函数在 string 中扫描与 pattern 匹配的部分,并将其替换为 replacement。

返回替换后的字符串。(如果没有可供替换的匹配项则会返回原字符串。)

如果 pattern 包含有括号内的子串,则 replacement 可以包含形如 \\digit 的子串,这些子串将被替换为数字表示的的第几个括号内的子串;\\0 则包含了字符串的整个内容。最多可以用九个子串。括号可以嵌套,此情形下以左圆括号来计算顺序。
如果未在 string 中找到匹配项,则 string 将原样返回。

在outputlib.php中的format_output()函数提供了对这些特殊标记的处理,同时也提供了对其它几个特殊标记的处理。通用的算法是:
对输出文本调用htmlspecialchars()函数来转换所有的特殊字符为html的特殊字符 对自定义的标记系统地进行字符串替换或正则式替换

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

< >