PHP strpos()返回奇数结果

时间:2010-08-13 13:27:32

标签: php security loops

我为我的网络应用程序编写了一个基本的“安全检查程序”。我需要一目了然地看看用户提交的代码是否包含恶意内容。

以下是我正在运行此代码的代码的截图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!)。我已经解决了这个问题,但是留下尾随逗号的问题仍然存在。我知道这是一个较小的问题,但我发誓它仍然不应该在那里......

4 个答案:

答案 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)

不要重新发明轮子。

http://htmlpurifier.org/

答案 3 :(得分:1)

您是否尝试过回显$ found然后执行View Source?我猜这个问题是你的某个项目没有基于HTML编码显示('<?')并且有一个逗号和空格实际上被删除了。

但我会用他的解决方案回应@Hammerite。