多少安全就足够了? - PHP

时间:2014-08-09 13:25:46

标签: php security pdo

我目前正在处理我开始的个人业务的第2版。在第一个版本中,我遇到了用户sql注入和使用xss的问题。

现在事情变得有点严重(活动量更大)我花时间尽可能多地学习卫生,准备好的陈述等,以提高项目的安全性。我知道没有100%的修复/安全系统可以实现,我相信我的实施足以保证足够的安全性,我只是想知道我能做多少。

我正在为所有数据库交互使用PDO Prepared语句。

数据库交互将不再需要删除功能(用户在v1上删除了表)

我使用PHP 5.5密码_hash作为密码

对所有输入和输出进行消毒(通过以下主题代码的各种意见阅读)

    // Input Sanitation
    function input($input) {
        $input = trim($input);  

        $search = array(
            '@<script[^>]*?>.*?</script>@si',   // Strip out javascript
            '@<[\/\!]*?[^<>]*?>@si',            // Strip out HTML tags
            '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly
            '@<![\s\S]*?--[ \t\n\r]*>@'         // Strip multi-line comments
        );

        if (get_magic_quotes_gpc()) {
            $input = stripslashes($input);
        }
        return preg_replace($search, '', $input);
    }

    // Html Sanitation
    function htmlInput($input) {
        $input = trim($input);  
        return strip_tags($input, '<p><b><i>');
    }

    // Output Sanitation
    function output($input) {
        return htmlspecialchars($input);
    }

    // Url Sanitation
    function url($input){
        $input = trim($input);  
        $input = strip_tags($input);
        $input = preg_replace('/[^A-Za-z0-9-]+/', '-', $input);
        $input = preg_replace("/[\/\&%#\$]/", "_", $input);
        $input = preg_replace("/[\"\']/", " ", $input);
        $output = strtolower($input);

        return $output;
    } 

由于尺寸的原因,我还没决定使用htmlpurifier。我希望在不牺牲安全性的前提下尽可能保持轻量级。

网站示例的某些部分:故障单系统 用户需要能够通过ckeditor创建格式化文本(允许标签

) 我一直有问题清理文本,同时保留允许的标签,所以如果有人有解决方案,我会喜欢听到它。

除此之外,我已经创建了各种检查,输入应该是数字通过is_numeric,登录表单受到保护免受强力尝试,我们将使用ssl进行登录,注册等。(罪犯ip被记录并被阻止一次管理员决定这样做),图像不能作为PHP等执行,并且我添加了各种其他东西来尝试保护网站。在我们重新启动之前,我只是想确保我没有忽视任何事情。

如果有人有任何我可以从中受益的资源,我会非常感激。我一直在环顾四周,我相信我已经涵盖了我所看到的一切。无论如何,请事先感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

您的观点已经是最重要的观点,另外您可以这样做:

  1. 对整个网站使用HTTPS,这可以避免很多问题,另请参阅SSL-strip。
  2. X-Frame-Options 添加到登录页面的HTTP标头中,以便无法在iframe中显示该页面。这有助于防止点击劫持。在PHP中,它看起来像这样:header('X-Frame-Options: DENY');
  3. Content-Security-Policy 添加到登录页面的HTTP标头中。如果浏览器支持CSP,则可以有效防止跨站点脚本。在PHP中,它看起来像这样:header("Content-Security-Policy: default-src 'self'; script-src 'self';");
  4. 删除内联JavaScript并将其放在外部* .js文件中。这使得CSP更有效。
  5. 在登录页面上重新生成会话ID,以使会话固定更加困难。
  6. 如果您的网站仅限HTTPS,则可以添加 HTTP严格传输安全性标头。 HSTS可以阻止用户(已经访问过您的网站一次)调用不安全的HTTP页面。这有助于防止SSL剥离。
  7. 当然还有更多可以做的事情,例如我会单独验证(测试输入是否符合预期)和转义(尽可能晚地仅针对给定的输出类型)。消毒输入有点可疑,无论是否有效,然后我会拒绝它。

答案 1 :(得分:0)

您可以简单地使用PEAR验证包来验证任何类型的输入。这比使用简单函数验证输入更可靠。

正如您所提到的,安全性绝不是100%保证,但SSL使得能够停止会话劫持。由于您有票务系统,因此最好使用SSL。如果您关注网站的速度,您可以在https协议上运行您的登录部分

祝你好运