-1

好的,所以我的问题是,使用这个 php 脚本,会生成一个随机令牌并用于使用您的帐户登录游戏,但有时,您可能会获得与另一个帐户相同的令牌并登录到他们的帐户。我需要的不是完全改变我的脚本,而是稍微修改它,使其不会产生两次相同的令牌。

<?php

                   ////////////DATABASE CREDENTIALS///////////
                         $generateToken = generateToken();    
                         $host = "********\SQLExpress";  
                         $user = "********";                        
                         $password = "*******";            
                         $database = "**********";

                   //////////////////////////////////////////

          //////////////////////Database Connection//////////////////////////// 
          $connect = mssql_connect($host,$user,$password);                    
          $db = mssql_select_db($database,$connect);                          
          if(!$db) die('<center>Connection with SQL Server failed!</center>');
          $succes = 0;                                         
          /////////////////////////////////////////////////////////////////


         /////////////////// Sanitize Data ////////////////////////
               function sanitize($data) {
               $data = trim($data);
               $data = htmlspecialchars($data);
               return $data;
               }

      //////////////////////////////// Generate Token /////////////////////////////////
      function generateToken($length = 50) {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $randomToken = '';
               for ($i = 0; $i < $length; $i++) {
                 $randomToken .= $characters[rand(0, strlen($characters) - 1)];
                   }
                    return $randomToken;
                      }
      ////////////////////////////////////////////////////////////////////////////////



               ///////////////// Define Username & Password ///////////////////
                   $username = sanitize($_POST['username']);
                   $password = sanitize($_POST['password']);
               ////////////////////////////////////////////////////////////////



          //////////////////// Check if Username & Password are correct //////////////////
                      $select_account = mssql_query("Select * from dbo.tAccounts where sUsername='$username' and sUserPass='$password'");
                      $verify_account = mssql_num_rows($select_account);
                         while($row = mssql_fetch_array($select_account))
                            {
                             $nemid = $row['nEMID'];
                            }
          ///////////////////////////////////////////////////////////////////////////////


         //////////////////////// Error Handling /////////////////////////////
                          if($verify_account == 0) {
                          echo 'error';
                          $succes = 0; } else { $succes = 1;
         /////////////////////////////////////////////////////////////////////


       ////////////////////////// Token Verification //////////////////////////////                   
       $getnemid = mssql_query("SELECT * FROM dbo.tTokens WHERE nEMID ='$nemid'");
       $tokenCheck = mssql_num_rows($getnemid);
       if($tokenCheck != 0) {
       $succes = 1;
       $inserttoken = mssql_query("UPDATE dbo.tTokens SET sToken='$generateToken' WHERE nEMID = '$nemid'");
       } else {
       $succes = 1;
       $createtoken = mssql_query("INSERT INTO dbo.tTokens (nEMID,sToken) VALUES ('$nemid','$generateToken')"); 
       } }
       ////////////////////////////////////////////////////////////////////////////



       /////////////////////////// Connect to Client /////////////////////////////////
          if($succes != 0) {
          $GetClientDATA = mssql_query("SELECT * FROM dbo.tTokens WHERE nEMID = '$nemid'");
          while($getToken = mssql_fetch_array( $GetClientDATA )) { 
          echo $getToken['sToken']; } } 
       ///////////////////////////////////////////////////////////////////////////////

?>

4

3 回答 3

1

为什么不使用唯一 ID(function.uniqid -> http://de2.php.net/manual/en/function.uniqid.php)?碰撞的可能性微乎其微。

于 2013-06-02T16:14:32.917 回答
0

您可以将当前的 UNIX 时间放在那里。UNIX 时间是以 1970 年 1 月 1 日开始计数的以秒为单位的时间戳,因此它永远不会再获得相同的值。

在 php 中,您可以使用以下方法轻松获取 unix 时间戳:

strtotime("now")

然后,您可以将其放在随机生成的令牌中的某个位置。如果您需要它更“安全”,您还可以在随机位置拆分时间戳,然后将两个部分彼此分开。

于 2013-06-02T16:04:19.637 回答
0

只需使用

microtime();

它将当前的 unix 时间降低到一毫秒。如果您仍然不满意,只需检查该令牌是否存在,如果存在则生成一个新令牌。或者干脆使用 Christian Kiewiet 的解决方案。:)

于 2013-06-02T16:21:27.447 回答