dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>PHP>php技术资料>文章内容
PHP中显示格式化的用户输入
来源:未知     作者:    
你可以在这个页面下载这个文档附带的文件,也可以在文件下载中的字符处理中下载这个文档描述如何安全显示的有格式的用户输入。我们将讨论没有经过过滤的输出的危险,给出一个安全的显示格式化输出的方法。

没有过滤输出的危险

  如果你仅仅获得用户的输入然后显示它,你可能会破坏你的输出页面,如一些人能恶意地在他们提交的输入框中嵌入script脚本:

This is my comment.
<script language="script:
alert('Do something bad here!')">.

  这样,即使用户不是恶意的,也会破坏你的一些HTML的语句,如一个表格突然中断,或是页面显示不完整。


只显示无格式的文本

  这是一个最简单的解决方案,你只是将用户提交的信息显示为无格式的文本。使用htmlspecialchars(),将转化全部的字符为HTML的编码。

  如<b>将转变为<b>,这可以保证不会有意想不到的HTML标记在不适当的时候输出。
这是一个好的解决方案,如果你的用户只关注没有格式的文本内容。但是,如果你给出一些可以格式化的能力,它将更好一些。

Formatting with Custom Markup Tags
用户自己的标记作格式化


  你可以提供特殊的标记给用户使用,例如,你可以允许使用...加重显示,...斜体显示,这样做简单的查找替换操作就可以了: $output = str_replace("[b]", "<b>", $output);
$output = str_replace("[i]", "<i>", $output);

  再作的好一点,我们可以允许用户键入一些链接。例如,用户将允许输入[link="url"]...[/link],我们将转换为<a href="">...</a>语句

  这时,我们不能使用一个简单的查找替换,应该使用正则表达式进行替换:
$output = ereg_replace('\[link="([[:graph:]]+)"\]', '<a href="\\1">', $output);

ereg_replace()的执行就是:
查找出现[link="..."]的字符串,使用<a href="..."> 替换它
[[:graph:]]的含义是任何非空字符,有关正则表达式请看相关的文章。


  在outputlib.的format_output()提供这些标记的转换,总体上的原则是:
调用htmlspecialchars()将HTML标记转换成特殊编码,将不该显示的HTML标记过滤掉,
然后,将一系列我们自定义的标记转换相应的HTML标记。

  请参看下面的源代码:
<?


function format_output($output) {
/****************************************************************************
* Takes a raw string ($output) and formats it for output using a special
* stripped down markup that is similar to HTML
****************************************************************************/

$output = htmlspecialchars(stripslashes($output));

/* new paragraph */
$output = str_replace('[p]', '<p>', $output);

/* bold */
$output = str_replace('', '<b>', $output);
$output = str_replace('
', '</b>', $output);

/* italics */
$output = str_replace('', '<i>', $output);
$output = str_replace('
', '</i>', $output);

/* preformatted */
$output = str_replace('[pre]', '<pre>', $output);
$output = str_replace('[/pre]', '</pre>', $output);

/* indented blocks (blockquote) */
$output = str_replace('[indent]', '<blockquote>', $output);
$output = str_replace('[/indent]', '</blockquote>', $output);

/* anchors */
$output = ereg_replace('\[anchor="([[:graph:]]+)"\]', '<a name="\\1"></a>', $output);

/* links, note we try to prevent script in links */
$output = str_replace('[link="', '[link=" script', $output);
$output = ereg_replace('\[link="([[:graph:]]+)"\]', '<a href="\\1">', $output);
$output = str_replace('[/link]', '</a>', $output);

return nl2br($output);
}

?>

一些注意的地方:

  记住替换自定义标记生成HTML标记字符串是在调用htmlspecialchars()之后,而不是在这个调用之前,否则你的艰苦的工作在调用htmlspecialchars()后将付之东流。

  在经过转换之后,查找HTML代码将是替换过的,如双引号"将成为"

nl2br()将回车换行符转换为<br>标记,也要在htmlspecialchars()之后。

  当转换[links=""] 到 <a href="">, 你必须确认提交者不会插入javascript脚本,一个简单的方法去更改[link=" 到 [link=" script, 这种方式将不替换,只是将原本的代码显示出来。

outputlib.
在浏览器中调用test.,可以看到format_output() 的使用情况

正常的HTML标记不能被使用,用下列的特殊标记替换它:

- this is bold
- this is italics
- this is [link="http://www.builder.com"]a link[/link]
- this is [anchor="test"]an anchor, and a [link="#test"]link[/link] to the anchor

[p]段落
[pre]预先格式化[/pre]
[indent]交错文本[/indent]

这些只是很少的标记,当然,你可以根据你的需求随意加入更多的标记

Conclusion
结论

这个讨论提供安全显示用户输入的方法,可以使用在下列程序中

留言板
用户建议
系统公告
BBS系统

 

 

上一篇:在PHP的图形函数中显示汉字   下一篇:php做饼图的函数
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·通过对PHP服务器端特性的配置加
·php与mysql三日通
·AJAX技术在PHP开发中的简单应用
·大家所使用的PHP开发环境
·PHP缓存的实现
·针对PHP新手总结的PHP基础知识
·一个简单实现多条件查询的例子
·PHP串行化变量和序列化对象
·PHP表单
·推荐阅读:php技术生成静态页面
·php实用函数
·php生成随机数
  相关文章
·在PHP的图形函数中显示汉字
·php做饼图的函数
·PHP调用三种数据库的方法(3)
·用PHP实现登陆验证码(类似条行码
·PHP调用三种数据库的方法(2)
·PHP安全配置(1)
·PHP调用三种数据库的方法(1)
·PHP安全配置(2)
·PHP文本数据库的搜索方法
·PHP安全配置(3)
·PHP下MAIL的另一解决方案
·PHP安全配置(4)
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763