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)
您没有定义$ username,并且在单引号字符串中使用它,因此SELECT查询无法执行
您应该使用预准备语句并将用户名绑定到SELECT查询中的参数,而不是将用户名直接粘贴到字符串中
您无需选择具有该用户名的用户以查看其是否已被使用,您只需选择计数并查看其是否为非零
如果SELECT查询没有返回任何行,则您的checkName函数不会返回任何值,因为您只在循环中返回行
我希望这些评论有用.