在Web App中与DB通信的适当安全性

时间:2013-02-03 12:50:07

标签: php sql-server security web-applications

我对这个特定领域真的有很多疑问。但基本上我只是想知道如何创建最有效和最安全的php session通信方法。我已经阅读了很多关于这个问题的网站,他们似乎并不认同或与我目前的情况有关。

我的问题是我不知道如何正确创建登录,会话,cookie,注册等以匹配高安全级别。到目前为止,这是我的想法。

1。 PHP会话

我将在登录后开始一个会话。我知道我有不同的方法来处理这些,但目前我创建了一个像$_SESSION['user']这样的会话变量,它允许我在会话期间存储用户的电子邮件地址。然后我在服务器结束会话时遇到问题。这导致我进入下一个房产。

2。 COOKIES

使用cookies我可以存储电子邮件地址和哈希编码的密码,然后能够根据这些登录信息重新创建会话。

<?
session_start();
require_once('config.php'); //retrieved from the servers include folder specified on the apache server.

// if session is closed that means that there wouldn't be stored a session variable called 'user' anymore.
if ($_SESSION['user'] == '') {

    // if the cookie hasn't been set..
    if ($_COOKIE['user'] == '') {

        // ... close the session and return to the login page
        session_destroy();
        header('Location: login.php?err=4'); // err=4 means session ended

    } else {

        // We don't know wether the user has logged in using e-mail or username, so that's why we connect using either email or username.
        $sql = 'SELECT * FROM login WHERE (email = :user and password = :psw) or (username = :user and password = :pass)';

        $statement = $conn->prepare($sql);

        $statement->bindParam(':user', $_COOKIE['user'], PDO::PARAM_STR);
        $statement->bindParam(':psw', $_COOKIE['psw'], PDO::PARAM_STR);

        if ($statement->execute() && $row = $statement->fetch()) {

            $_SESSION['user'] = $_COOKIE['user'];

        } else {

            // Failed to retrieve data somehow.
        }
    }
}

?>

但后来我读到session_id()也是一个cookie存储值,每次重新创建会话时都是一样的。所以我实际上不必再次将值与服务器匹配,因为我可以简单地再次启动会话并从我离开的地方继续..但我认为这是一个安全中断,因为如果session_id()已经被其他人检索后,他们将能够使用相同的session_id()等进行连接。

第3。我还需要使用其他域的值

我知道可以使用其他网站的相同登录信息,例如Facebook,Google等。我希望能够为我正在使用的所有域重用相同的登录名,但我如何确保只有我的(注册)域可以访问登录信息,而不是其他站点? / p>

4。还有另一种安全方式吗?

这实际上是我的问题。我不确定我所做或计划的是非常安全的,我绝对不认为我的新手体验足以创建一个登录安全的数据库连接。所以我想知道是否有人能够以最有效和最安全的方式将我链接到以正确方式存储和使用PHP中的登录详细信息的官方页面。

2 个答案:

答案 0 :(得分:2)

当你想在PHP中处理登录时,PHP会话是要走的路。要以保存方式执行此操作,您应确保会话数据存储在服务器上,而客户端只在cookie中有session_id。

每次进行安全级别更改(登录,注销等)时,都应重新生成会话ID以确保更安全(旧的被盗会话ID将无法使用)。您还应该使用http_only创建会话cookie,这将导致无法使用JavaScript窃取cookie。

从安全角度来看,我建议您永远不要使用cookie来存储敏感信息。存储在cookie中的信息不会保存,它们存储在客户端计算机上,可以更改或被盗。

谷歌和Facebook使用openAuth(2)登录各种网站。我不确定这是否适用于您,但cookie最多只能由一个域访问。

我建议使用PHP会话,如果你正确处理它们,它们是安全的 。如果你不确定如何做到这一点,你可以看一些好的PHP框架。我从经验中知道Laravel框架有一个很好的登录处理程序。

答案 1 :(得分:0)

会话已使用Cookie来保持会话。如果您正确配置它,您可以无限期地打开会话,如果这是您想要做的事情(除非用户删除cookie,但您的基于cookie的解决方案也无济于事)。你用cookies建立自己的东西可能不那么安全,所以我不打扰它。当然正确配置session settings

跨域重用信息是一个复杂的领域。如果它们都由同一个数据库支持,只需让用户登录任何站点即可。您将需要管理单独的会话(读取:用户需要单独登录每个站点,但可以使用相同的用户/密码)或构建一些相当复杂的跨域会话共享(提示:您可能不希望) 。如果您想寻求更复杂的解决方案(例如,因为您的域名不共享中央数据库),请谷歌“单点登录”并准备好阅读数小时,数天和数周。