Php 使用游戏启动器和SQL数据库生成随机令牌
好的,所以我的问题是,使用这个php脚本,会生成一个随机令牌,并用于使用您的帐户登录游戏,但有时,您可能会获得与另一个帐户相同的令牌,然后登录到他们的帐户。我需要的不是完全改变我的脚本,而是稍微修改它,这样它就不能生成相同的令牌两次Php 使用游戏启动器和SQL数据库生成随机令牌,php,sql,database,token,Php,Sql,Database,Token,好的,所以我的问题是,使用这个php脚本,会生成一个随机令牌,并用于使用您的帐户登录游戏,但有时,您可能会获得与另一个帐户相同的令牌,然后登录到他们的帐户。我需要的不是完全改变我的脚本,而是稍微修改它,这样它就不能生成相同的令牌两次 <?php ////////////DATABASE CREDENTIALS/////////// $generateToken = generateToken();
<?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']; } }
///////////////////////////////////////////////////////////////////////////////
您可以将当前UNIX时间放在其中。UNIX时间是一个以秒为单位的时间戳,它从1970年1月1日开始计数,因此它永远不会再得到相同的值
在php中,您可以使用以下方法轻松获取unix时间戳:
strtotime("now")
然后,您可以将其放在随机生成的令牌中的某个位置。如果您需要更“安全”,您还可以在随机位置拆分时间戳,然后将这两部分分开。为什么不使用唯一的ID(function.uniqid->)?碰撞的可能性微乎其微 简单地使用
microtime();
它将当前unix时间缩短到毫秒。
如果您仍然不满意,只需检查该令牌是否存在,如果存在,则生成一个新令牌。
或者简单地使用Christian Kiewiet的解决方案: 如果同时生成两个令牌怎么办?在这里,基于第二个的解析更可能产生冲突。仍然存在随机部分,这将阻止相同的令牌。您还可以添加到当前用户IP中,并从中生成SHA哈希。如果那会产生碰撞,我不知道什么不会。