用PHP过滤html危险内容
时间:2009-08-08 来源:hkebao
在php的网页程序中,我们会经常用到一些可视化编辑器.对于数据库安全,可以使用mysql_real_escape_string()来将字符串转 义.但是填写的内容中有一些不良的html标签可能导致而且变形,严重者可能会现出跨站攻击之类的安全问题.所以带有html的内容中增加过滤恶意的 html代码是很有必要的.
不过google里,如果搜索 "php 过滤 html"
你只会找到以下的类似的函数
function uh($str)
{
$farr = array(
"/s+/",//过滤多余的空白
"/< (/?)(script|i?frame|style|html|body|title|link|meta|?|%)([^>]*?)> /isU",//过滤 <script 等可能引入恶意内容或恶意改变显示布局的代码,如果不需要插入flash等,还可以加入<object的过滤
"/(<[^>]*)on[a-zA-Z]+s*=([^>]*>)/isU",//过滤javascript的on事件
);
$tarr = array(
" ",
"\\1\\2\\3",//如果要直接清除不安全的标签,这里可以留空
"\\1\\2",
);
$str = preg_replace( $farr, $tarr, $str);
return $str;
}
这个函数的路思是正确的,但是有很多问题,例如
<style>
.message{}
</style>
使用上面的函数过滤后,会变成
.message{}
安全是没有问题了.不过页面会多显示了.message{}这样的内容.
<a href="post.php?actions=newthread&fid=10&extra=&special=1">发布投票</a>
过滤后会变成
<a href="po t.php?action =newthread&fid=10&extra=& pecial=1">发布投票</a>
看到这些问题,我不过能使用这样的函数在我的程序里.所以我必须过滤这些内容
function filterHtml($str)
{
$farr = array(
"/<!DOCTYPE([^>]*?)>/eis",
"/<(\/?)(html|body|head|link|meta|base|input)([^>]*?)>/eis",
"/<(script|i?frame|style|title|form)(.*?)<\/\\1>/eis",
"/(<[^>]*?\s+)on[a-z]+\s*?=(\"|')([^\\2]*)\\2([^>]*?>)/isU",//过滤javascript的on事件
"/\s+/",//过滤多余的空白
);
$tarr = array(
"",
"",
"",
"\\1\\4",
" ",
);
$str = preg_replace( $farr,$tarr,$str);
return $str;
}
显示我这些函数里没有上面提到的问题
不过google里,如果搜索 "php 过滤 html"
你只会找到以下的类似的函数
function uh($str)
{
$farr = array(
"/s+/",//过滤多余的空白
"/< (/?)(script|i?frame|style|html|body|title|link|meta|?|%)([^>]*?)> /isU",//过滤 <script 等可能引入恶意内容或恶意改变显示布局的代码,如果不需要插入flash等,还可以加入<object的过滤
"/(<[^>]*)on[a-zA-Z]+s*=([^>]*>)/isU",//过滤javascript的on事件
);
$tarr = array(
" ",
"\\1\\2\\3",//如果要直接清除不安全的标签,这里可以留空
"\\1\\2",
);
$str = preg_replace( $farr, $tarr, $str);
return $str;
}
这个函数的路思是正确的,但是有很多问题,例如
<style>
.message{}
</style>
使用上面的函数过滤后,会变成
.message{}
安全是没有问题了.不过页面会多显示了.message{}这样的内容.
<a href="post.php?actions=newthread&fid=10&extra=&special=1">发布投票</a>
过滤后会变成
<a href="po t.php?action =newthread&fid=10&extra=& pecial=1">发布投票</a>
看到这些问题,我不过能使用这样的函数在我的程序里.所以我必须过滤这些内容
function filterHtml($str)
{
$farr = array(
"/<!DOCTYPE([^>]*?)>/eis",
"/<(\/?)(html|body|head|link|meta|base|input)([^>]*?)>/eis",
"/<(script|i?frame|style|title|form)(.*?)<\/\\1>/eis",
"/(<[^>]*?\s+)on[a-z]+\s*?=(\"|')([^\\2]*)\\2([^>]*?>)/isU",//过滤javascript的on事件
"/\s+/",//过滤多余的空白
);
$tarr = array(
"",
"",
"",
"\\1\\4",
" ",
);
$str = preg_replace( $farr,$tarr,$str);
return $str;
}
显示我这些函数里没有上面提到的问题
相关阅读 更多 +