多少安全措施才足够?——PHP


How much security is enough? - PHP

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

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

我使用PDO准备语句的所有数据库交互。

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

我使用PHP 5.5 password_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等,还有各种其他的东西,我添加了尝试保护网站。在我们重新开始之前,我只是想确保我没有忽略任何事情。

如果任何人有任何资源,我可以从中受益,我将非常感激。我四处看了看,我相信我所看到的一切都涵盖了。无论如何,提前感谢你的帮助。

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

  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页面。

当然还有很多事情可以做,例如,我将分开验证(测试输入是否符合预期)和转义(尽可能晚,仅针对给定的输出类型)。对输入进行消毒有点可疑,不管它是否有效,然后我将拒绝它。

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

正如你提到的,安全性从来没有100%保证,但SSL有能力阻止会话劫持。因为您有一个票据系统,所以最好使用SSL。如果你关心你的网站的速度,你可以在https协议上运行你的登录部分

好运