这个PHP代码对于登录系统是否安全?

mcb*_*eav 0 php security login

这只是其中的一部分,但它首先进行连接,然后检查用户名是否存在,然后将数据插入表中.我对PHP并不是很了解,所以没有必要扯到我身上.只是想在这里学习,我想知道我是否走在正确的轨道上.

require("constants.php");
try {  
  $DBH = new PDO("mysql:host=$host;dbname=$dbname", $dbconnect, $dbpass);  
  $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );    
}  
catch(PDOException $e) {  
    echo "sorry, something happened. try going back and try again.";  
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);  
}  

function checkName(){
$STH = $DBH->query('SELECT username FROM users WHERE username = $username');
$STH->setFetchMode(PDO::FETCH_OBJ);
while($row = $STH->fetch()) {
    if($username != $row->username){
    $check = 1;
    }
    else{
    $check = 0;
    }
    return $check;
}
function createSalt()
{
    $string = md5(uniqid(rand(), true));
    return substr($string, 0, 3);
}
function register(){
$check = checkName();
if($check == 1){
$salt = createSalt();
$hash = sha1($salt . $hash);
$data = array($username, $hash, $salt, $ip);
$STH = $DBH->("INSERT INTO users (username, password, salt, ip) values (?, ?, ?)");
$STH->execute($data);
}
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 7

  1. 您没有定义$ username,并且在单引号字符串中使用它,因此SELECT查询无法执行

  2. 您应该使用预准备语句并将用户名绑定到SELECT查询中的参数,而不是将用户名直接粘贴到字符串中

  3. 您无需选择具有该用户名的用户以查看其是否已被使用,您只需选择计数并查看其是否为非零

  4. 如果SELECT查询没有返回任何行,则您的checkName函数不会返回任何值,因为您只在循环中返回行

我希望这些评论有用.