2012-01-14 52 views
0

我正在为我的新项目编写帐户验证系统。目前注册/连接页面没问题!只有帐户验证页面不起作用。确认邮件通过电子邮件发送到注册页面。WHERE子句中的空格?

,你可以在这里注册:http://protect.you-test.ch/inscription.php

您可以连接在这里:http://protect.you-test.ch/connexion.php

问题是,当用户名具有空间这就要求犯规的工作:

$sql = "SELECT user_key,verified_user FROM users WHERE login='".$login."'"; 

,但在没有空间,它的作品!

编辑:问题随机发生。有时它不适用(有空格)。

此问题只出现在此页面上,而不是连接页面!

当前代码:

<?php 
include("mysql_connect.php"); 

$login = base64url_decode($_GET['login']); 
$login = trim($login); 
$login = mysql_real_escape_string($login); 

echo '</br>'.$login.'</br>'; 
echo '</br>'.$user_key.'</br>'; 

$sql = "SELECT user_key,verified_user FROM users WHERE login='".$login."'"; 

$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
$data = mysql_fetch_array($req); 

if ($data['0'] == 0) { 
$clebdd = $data['user_key']; 
$actif = $data['verified_user']; 

if($actif == '1') { 
    echo "Votre compte est déjà actif !"; 
} else { 
    if($user_key == $clebdd) {   

     $sql = 'UPDATE users SET verified_user = 1 WHERE login="'.$login.'"'; 
     $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
     echo "Votre compte a bien été activé !";  
    } else { 
     echo "Erreur ! Votre compte ne peut être activé ...1"; 
    } 
} 
} else { 
echo "Erreur ! Votre compte ne peut être activé ...2"; 
} 

function base64url_encode($data) { 
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); 
} 

function base64url_decode($data) { 
    return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT)); 
} 

?> 
+0

echo out'$ sql'它看起来像什么? – RMcLeod 2012-01-14 15:46:25

+0

打印出不起作用的SQL,您将看到问题所在。提示:'mysql_real_escape_string'应该是你做的最后一件事。 – Jon 2012-01-14 15:47:05

+0

echo $ sql; - > SELECT user_key,verified_user FROM users WHERE login ='TheTime 12' – TheTime 2012-01-14 15:48:50

回答

0

add TRIM on $login变量在您的PHP脚本。例如:trim($login)

+0

谢谢!我已经添加了该检查,但事实并非如此。我测试的字符串很干净。只有一个空间。 – TheTime 2012-01-14 15:55:45

3

是,空间会甩开一个字符串比较:

'username' 
' username' 
'username ' 

三种完全不同的字符串通过正规平等的测试放时,即使一个人会解读为此他们一样。

你可以尝试

$login = trim($login); 

从字符串的两边充塞到您的查询之前剥离空白。

+0

谢谢!我已经添加了该检查,但事实并非如此。我测试的字符串很干净。只有一个空间。 – TheTime 2012-01-14 15:55:31

+0

是的,但是如果它在数据库中存储为'user',那么''user'='user''(注意空格)将返回false。另外,base64_urldecode()调用的ponit是什么? PHP在放入$ _GET之前解码所有表单域/ url参数。你会进行双重解码并返回'false',因为当你尝试解码时,数据不是base64。同样,在执行mysql字符串转义后进行解码可能会使您的转义字符串再次不安全。在查询中使用之前,escape_string必须是字符串上的最后一个操作。 – 2012-01-14 15:59:20

+0

不会改变任何东西,如果我使用或不使用这些功能。这不是问题。尝试,你会看到它解码正确。 – TheTime 2012-01-14 16:19:09