我为我的网络应用程序编写了一个基本的“安全检查程序”。我需要一目了然地看看用户提交的代码是否包含恶意内容。
以下是我正在运行此代码的代码的截图:http://cl.ly/677a6dc40034f096697f
这是PHP代码我正在使用这三个代码:
<!-- The View -->
<h2>Security analysis</h2>
<?php echo securitycheck($html, $css, $js); ?>
-
// The controller
function securitycheck($html, $css, $js)
{
// The code is the html, css, and js, appended together. We're scanning it all.
$code = $html." ".$css." ".$js;
// $insecure is our array of naughty things to search for.
$insecure = array(
/* HTML Elements */
'applet',
'basefont',
'base',
'behavior',
'bgsound',
'blink',
'embed',
'expression',
'frameset',
'frame',
'ilayer',
'iframe',
'isindex',
'javascript',
'layer',
'link',
'meta',
'object',
'plaintext',
'style',
'script',
'xml',
'xss',
/* Javascript Elements */
'alert',
'cmd',
'passthru',
'eval',
'exec',
'expression',
'system',
'fopen',
'fromcharcode',
'fsockopen',
'file',
'file_get_contents',
'readfile',
'unlink',
/* Misc Elements */
'vbscript:',
'<?',
'<?php',
'?>'
);
$found = "";
$output = "<p><strong>Potentially insecure items found:</strong> ";
foreach($insecure as $item)
{
if (($pos = strpos($code, $item)) !== FALSE)
{
$found .= "$item, ";
}
}
if ($found == "")
{
$output .= "None.<br/>";
}
else
{
$output .= "<span class=\"alert\">".substr($found, 0, -2)."</span>"."</p><br/>"; // cuts trailing comma and space from $found
}
return $output;
}
最后,这里是返回输出的截图(用HTML格式):http://cl.ly/f246dc419fb499dd6bd7
查看截图?有几件事是错的。尾随空格和逗号尚未被截断(我使用substr()
进行了操作,并且它正在报告两个alert
,当您从第一个屏幕截图中看到时,只有一个已经通过此
我做错了什么?
谢谢!
杰克
编辑:正如Fosco所指出的那样,alert
在我的阵列中被列出两次(doh!)。我已经解决了这个问题,但是留下尾随逗号的问题仍然存在。我知道这是一个较小的问题,但我发誓它仍然不应该在那里......
答案 0 :(得分:1)
处理找到的项目的一种更简单的方法是使用......
$found = array();
foreach($insecure as $item)
{
if (($pos = strpos($code, $item)) !== FALSE)
{
$found[] $item;
}
}
$found = implode(', ', $found);
字符串中只有一个警告,但它在你的$ insecure列表中两次,因此它在输出中出现两次。为避免这种情况,您必须单独扫描每个部分。
答案 1 :(得分:1)
乍一看,您的代码看起来应该提供您想要的输出。我不确定会出现什么问题。
我建议不要将$found
构建为字符串,而是建议将其构建为数组,然后使用implode()
来获取字符串:
$found = "";
替换为$found = array();
$found .= "$item, ";
替换为$found[] = $item;
if ($found == "")
{
$output .= "None.<br/>";
}
else
{
$output .= "<span class=\"alert\">".substr($found, 0, -2)."</span>"."</p><br/>"; // cuts trailing comma and space from $found
}
用这个:
if (!count($found))
{
$output .= "None.<br/>";
}
else
{
$output .= "<span class=\"alert\">".implode(', ',$found)."</span>"."</p><br/>"; // cuts trailing comma and space from $found
}
答案 2 :(得分:1)
不要重新发明轮子。
答案 3 :(得分:1)
您是否尝试过回显$ found然后执行View Source?我猜这个问题是你的某个项目没有基于HTML编码显示('<?
')并且有一个逗号和空格实际上被删除了。
但我会用他的解决方案回应@Hammerite。