所以我允许用户使用用户名和密码创建帐户。当用户使用以下方法创建新帐户时,我已设法加密密码:
$hash = password_hash($password, PASSWORD_BCRYPT);
但是登录时我遇到了password_verify的问题,有人可以帮我解决一下我的问题吗?我知道它是这样的:
password_verify($password, $hash)
但我不知道如何构造它或在代码中添加它的位置。提前致谢。这就是我所拥有的:
<?php
if (isset($_GET["username"]) && isset($_GET["password"]) ){
$username = $_GET["username"];
$password = $_GET["password"];
$result = login( $username, $password);
echo $result;
}
function makeSqlConnection()
{
$DB_HostName = "";
$DB_Name = "";
$DB_User = "";
$DB_Pass = "";
$con = mysql_connect($DB_HostName,$DB_User,$DB_Pass) or die(mysql_error());
mysql_select_db($DB_Name,$con) or die(mysql_error());
return $con;
}
function disconnectSqlConnection($con)
{
mysql_close($con);
}
function login($username, $password)
{
$con = makeSqlConnection();
$sql = "select * from login where username = '$username' and password = '$password';";
$res = mysql_query($sql,$con) or die(mysql_error());
$res1 = mysql_num_rows($res);
disconnectSqlConnection($con);
if ($res1 != 0) {
return 1;
}else{
return 0;
}// end else
}// end of Function
?>
答案 0 :(得分:1)
一般做法如下:
var _viewController:UITableViewController!
var flag = 0
func filter(sender: UIButton){
if(flag == 1){
_viewController.willMoveToParentViewController(nil)
_viewController.view.removeFromSuperview()
_viewController.removeFromParentViewController()
flag = 0
return
}
addChildViewController(_viewController)
_viewController.view.frame.origin.y = filterButton.frame.maxY
_viewController.view.frame.origin.x = self.view.frame.size.width-250
_viewController.view.frame.size.width = 250
_viewController.view.frame.size.height = 500
self.view.addSubview(_viewController.view)
_viewController.didMoveToParentViewController(self)
flag = 1
}
override func viewDidLoad() {
super.viewDidLoad()
_viewController = storyboard!.instantiateViewControllerWithIdentifier("UserViewController") as! UserViewController
}
=输入的用户名的数据库中获取password
哈希。我将在这里为您提供一些伪代码概述上述流程:
username
备注强>
$query = SELECT password FROM users WHERE username = '$username'
$data = FETCH_THE_DATA($query);
if(password_verify($USER_INPUTTED_PASSWORD, $data['password'])) {
// password is correct
} else {
// password is in-correct
}
个功能。该库已弃用,因为它不可靠,将在以后的PHP版本中删除。
password_verify()
,它清楚地表明您比较用户输入的密码&#34;针对存储在数据库中的散列版本。答案 1 :(得分:0)
由于我今天感觉很好,很困,我会写一堆代码。
这是如何将PDO与预准备语句一起使用的示例。你必须根据你的需要调整它,你必须检查post / get是否也是空的。 我更喜欢使用POST请求登录,所以这个例子将使用POST请求..
这是我的用户类。哪个使用占位符和绑定而不是直接将参数传递给查询。这将对SQL注入攻击提供一些保护。
class User{
private $dbh;
function __construct(){
$this->dbh = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_NAME.';charset=utf8mb4', DB_USER, DB_PASSWORD) or die('db connect error');
}
function create($username, $password){
$status = false;
try{
$stmt = "INSERT INTO login (username, password)
VALUES (?, ?)";
$qry = $this->dbh->prepare($stmt);
$qry->bindParam(1, $username);
$qry->bindParam(2, $password);
$status = $qry->execute();
}catch(PDOException $e){
$e->getMessage();
}
$qry->closeCursor();
return $status;
}
public function getPassword($username){
$status = false;
try{
$stmt = "SELECT * FROM login WHERE username = ? LIMIT 1";
$qry = $this->dbh->prepare($stmt);
$qry->bindParam(1, $username);
$qry->execute();
$status = $qry->fetch(PDO::FETCH_ASSOC);
}catch(PDOException $e){
$e->getMessage();
}
$qry->closeCursor();
return $status;
}
}
这是如何创建用户。请注意,我不检查用户名是否已存在。您可以自己实现它,也可以在用户名列上使用唯一索引,前提是排序规则不区分大小写。 我还增加了默认值10的成本,我定义了PASSWORD_DEFAULT,因为我希望PHP引擎始终使用最强的可用算法(目前是bcrypt)。
function hashPassword($password){
$password = password_hash($password, PASSWORD_DEFAULT,array('cost' => 16));
return $password;
}
$user = new User;
$_POST['password'] = hashPassword($_POST['password']);
if(!$user->create(trim($_POST['username']),$_POST['password'])){
echo 'Failed creating user';
}else{
echo 'User created';
}
这是验证密码的方法。
$user = new User;
$getPassword = $user->getPassword(trim($_POST['username']));
if(!$getPassword){
echo 'Error fetching user';
}else{
if(!password_verify($_POST['password'], $getPassword['password'])){
echo 'Login failed';
}else{
echo 'Login successful';
}
}