【问题标题】:PHP Security checklist (injection, sessions etc)PHP 安全清单(注入、会话等)
【发布时间】:2010-12-30 08:54:07
【问题描述】:

那么使用 PHP 和 MySql 的人应该关注什么样的事情才能最大限度地提高安全性。

我做过的事情:
-mysql_real_escape_string 所有输入
- 转义 em 后验证所有输入
- 在我的表名之前放置随机字母数字
-50 个字符 salt + Ripemd 密码

这是我认为我懈怠的地方:
-我对会话和保护它们一无所知。如果您所做的只是:

session_start(); 
$_SESSION['login']= $login;

并检查它:

session_start();
if(isset($_SESSION['login'])){

-我听说过其他形式的注射,比如跨站注射等等…… - 可能还有很多我不知道的事情。

是否有关于使 php 安全的“清单”/Quicktut?我什至不知道我应该担心什么。我有点后悔现在没有建立 cakephp,因为我不是专业人士。

【问题讨论】:

    标签: php mysql security sql-injection


    【解决方案1】:

    您可以尝试通过测试用户代理来避免劫持。

    类似的东西:

    if (isset($_SESSION['userAgent'])) {
        if ($_SESSION['userAgent'] != md5($_SERVER['HTTP_USER_AGENT'])) {
           // HACK !!!
           // Kill the process or ask for authenticating
        }
    }
    else {
        $_SESSION['userAgent'] = md5($_SERVER['HTTP_USER_AGENT']);
    }
    

    【讨论】:

    • 这不会阻止严重的黑客劫持您的会话。
    • 首先看一下这个:stackoverflow.com/questions/328/php-session-security UserAgent 检查也被提及,但正如您从 cmets 看出的那样,我不是唯一一个认为它没用的人查看。如果检查失败,你只能说你正在与一个非常愚蠢的黑客打交道。
    【解决方案2】:

    如果您的应用程序允许发布任何类型的内容,您应该在登录时使用某种加密。 SSL当然是最好的,可怜的mans ssl在发布登录表单之前用JS加密密码。

    为避免会话劫持,请将会话绑定到登录时的 ip,(在登录时保存 ip 并与每个请求进行比较)。

    问候, //t

    【讨论】:

      【解决方案3】:

      对于 XSS 和其他注入类型,主要是 HTML 和 js 注入,关键的安全性是转义所有输出。您在 HTML 中粘贴的所有内容都应该转义为 HTML,这意味着浏览器中不应看到任何 js 或 HTML由直接来自数据库的内容生成的内容。

      以用户名为例,在表单中设置的用户不应包含任何 HTML 或 js 代码。如果有人以任何方式注入这样的东西,你就会遇到一些问题(最简单的注入方法是大多数应用程序中的搜索表单输入,如果你的搜索在响应页面中得到回显)。所以所有这些输出都应该在输出之前有一个 htmlspecialchars()。

      这里有一些有用的链接:

      【讨论】:

        【解决方案4】:

        有多种黑客攻击方式。第一种是当一个真实的(或假的)用户试图在你的软件中寻找漏洞以试图破坏你的服务器。您将需要转义和输入检查以防止 SQL 注入解决此问题。

        (或“一个”)其他人是试图窃取会话以冒充其他用户的黑客。这使他们能够访问(和更改)他们无权获得的数据。

        使用mysql_real_escape_string 修复了SQL 注入。用的时候用的好,用的好,就不用怕SQL注入了。无需在表名前添加随机字符。这将使您的编程更加困难,同时不会提供真正的额外安全性。 您还可以使用mysqli 和参数化查询,它们根本没有这个问题。 mysqli 为您处理转义。从理论上讲,参数化查询甚至可以运行得更快,因为可以更有效地缓存查询。然而,在实践中,情况并非如此。只是从 MySQL 5.2 开始,这些查询才被缓存,但仍然没有达到应有的效率。不过,现在这没什么好担心的。现在任何解决方案都可能对您来说足够好。

        您永远不应该做的一件事是在用户生成的内容中允许 PHP 代码。如果您允许用户键入 PHP,您将允许他们破坏您的应用程序并可能修改您的数据库。此外,当黑客设法冒充用户/内容编辑器时,如果您允许内容包含 PHP,他就会免费获得一个完整的工具箱。

        为了防止会话被劫持,我认为最好使用 SSL。如果您不想通过 SSL 为所有页面提供服务器,您可以选择将会话保存在 cookie 中,但在完成重要更改时要求重新登录(使用 SSL)。

        【讨论】:

        • 嘿。感谢您的精心回复。 mysql_real_escape_string 的问题早些时候出现在我面前,当我查看手册时,我觉得它暗示它只适用于某些类型的注射。如果我在所有输入上都使用它,我可以安全注射吗?另外:在我得到它之前是否有临时使用 ssl 的替代解决方案?
        • 它适用于在查询中使用输入值的情况下的 SQL 注入。就像当您允许搜索某些内容并让某人在 $search 中输入一个值时,您可以构建一个类似 $query = "SELECT * FROM Pages WHERE content LIKE '%$search%'"; 的查询,除非有人搜索 cow%'; drop database; --,否则这非常好。似乎不太可能?也许不是.. 无论如何,除了当有人搜索包含' 的内容时可能出现的简单问题之外,这就是您要防止的那种邪恶黑客攻击。 :)
        • 至于 SSL 的替代品,我不是这方面最伟大的专家,所以最好不要用一些可能对您毫无益处的愚蠢想法来回答这个问题。您甚至可以考虑为此提出一个新问题,因为它与 SQL 注入完全不同。
        猜你喜欢
        • 2013-02-18
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        • 1970-01-01
        • 2020-04-16
        相关资源
        最近更新 更多