【问题标题】:session management: problem displaying username in the header会话管理:在标题中显示用户名的问题
【发布时间】:2011-11-25 16:58:22
【问题描述】:

我正在为我的网站开发一个简单的登录和注销模块,没有任何安全措施。我在 windows xp 机器上使用 wamp。当用户提交登录信息时,我正在创建会话,它将重定向到 process.php 文件,该文件创建会话变量并启动会话。现在,如果登录成功,用户将被重定向到包含头文件的欢迎页面(显示涉及登录注销帮助选项的标题)问题是当用户成功登录时,标题没有将登录链接更改为注销。下面的代码来自 process.php,它启动了一个登录。

$username = $_POST['username'];
        $password = $_POST['password'];

        //echo "{$username}:{$password}";
        $connection = mysql_connect("localhost","root","");
        if(!$connection)
        {
            die("Database Connection Failed".mysql_error());
        }
        $db_select = mysql_select_db("tester",$connection);
        if(!$db_select)
        {
            die("Database Selection Failed".mysql_error());
        }
        $result = mysql_query("SELECT * FROM user",$connection);
        if(!$result)
        {
            die("Database Selection Failed".mysql_error());
        }


        $q = "SELECT * FROM user " ."WHERE Name='".$username."' AND Password='".$password. "' ";
         // Run query
         $r = mysql_query($q);

         if ( $obj = @mysql_fetch_object($r) )
        {
            session_start();
            // Login good, create session variables
            $_SESSION["valid_id"] = session_id();
            $_SESSION["valid_user"] = $_POST["username"];
            $_SESSION["valid_time"] = time();

            Header('Location: welcome.php');

以下代码来自welcome.php中包含的header.php

    </div>

    <div id = "userdetail">

        <?php

        if(isset($_SESSION["valid_user"]))
        {
            echo($_SESSION["valid_user"]." " ); 
             echo("<a href=logout.php>Logout</a>"); 

        }
        else
        {
            echo("<a href = login.php>Sign In</a>");
        }

        ?>

              | Help |  Search      

            <input type = "text" name = "searchbox" value = "" />
    </div>
</div>

【问题讨论】:

  • 您的示例代码包含 sql 注入错误。 $q = "SELECT * FROM user " ."WHERE Name='".$username."' AND Password='".$password. "'";您必须转义参数名称和密码!

标签: php mysql session login


【解决方案1】:

您必须每次在每个被调用页面上调用 start_session()。 这应该始终是您在页面中执行的第一个调用。

注销时调用 session_destroy。

另外你应该清除 $_SESSION 变量

$_SESSION = array();

编码提示: 使用smarty 之类的模板引擎拆分您从 php 代码中显示的内容 您的代码包含 sql 注入错误,请参阅我对您帖子的评论。

您还应该使用散列密码并且不要忘记加盐。 不要将普通密码存储到您的数据库中。

SQL injection

【讨论】:

  • 谢谢伯恩德。我不知道我必须在每个涉及会话的文件中放置 session_start()。问题解决了。
  • 但也修复了 sql-inqjection 或任何人都可以登录,即使不知道任何用户/密码。
  • 我还没有完全理解 sql-injection 但在编写进一步的登录代码之前一定会抽出时间彻底理解它。感谢所有帮助。
  • 好的,尝试使用以下用户名 ' 或 1=1 -- 看看你的 sql 语句中的字符串会发生什么。看看最终执行的sql。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多