나는 과거에 프로젝트에 PHP를 소량 사용했지만 암호를 해시하려고 시도하면서 새로운 것을 시도하고 있습니다.
별도의 페이지에는 checkRegistration.php 양식으로 제출시 리디렉션되는 웹 양식이 있습니다.이 양식은 데이터베이스에 연결하고 사용자 값을 가져 와서 확인한 다음 해당 열에 입력합니다.
지금까지 전달되는 모든 값은 "0"으로 입력되거나 비어있는 password_hash 함수에 의해 전달되는 값을 제외하고 올바르게 입력되고 있습니다. 나는 그것이 0이기 때문에 올바르게 처리되지 않고 내가 뭘 잘못하고 있는지 궁금합니다.
<?php
$con = mysqli_connect("127.0.0.1","root","","projectdatabase");
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$password_user_input = $_POST['password'];
$options = array('cost' => 10);
$sql="INSERT INTO user_information (firstName, lastName, userName, password, email, contactNum)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[uname]','password_hash($password_user_input, PASSWORD_BCRYPT, $options)','$_POST[email]','$_POST[number]')";
if (!mysqli_query($con,$sql))
{
die('Error: ' . mysqli_error($con));
}
header("location:login.php");
mysqli_close($con);
?>
password_hash()
함수를 올바르게 사용 하지 않고 VALUES에 함수를 전달할 수 없습니다.
정의되지 않은 함수임을 알리는 오류가 발생했거나 받았어야합니다. 그렇지 않으면 암호 열에 password_hash(hashed_password_string, PASSWORD_BCRYPT, Array)
문자열 이 포함 됩니다. 테스트 할 때받은 두 가지 결과입니다.
수행해야 할 작업은 다음과 같습니다.
변수를 미리 정의하고 함수에 전달해야합니다.
$password_user_input = $_POST['password'];
$options = array('cost' => 10);
$pass = password_hash($password_user_input, PASSWORD_BCRYPT, $options);
$sql="INSERT INTO user_information (firstName, lastName, userName, password, email, contactNum)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[uname]','$pass','$_POST[email]','$_POST[number]')";
그러나이 방법을 사용하면 SQL 주입이 가능 합니다.
사용 제표를 작성 , 또는 PDO 준비된 문으로 , 그들은 훨씬 더 안전있어 .
다음은 준비된 진술과 함께 PDO를 사용하여 ircmaxell의 답변 https://stackoverflow.com/a/29778421/ 에서 가져온 방법 입니다.
라이브러리를 사용하십시오. 진지하게. 그들은 이유가 있습니다.
password_hash()
password-compat
(위의 호환성 팩스스로하지 마십시오. 자신의 소금을 만들고 있다면 잘못하고있는 것 입니다. 이를 처리하는 라이브러리를 사용해야합니다.
$dbh = new PDO(...);
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
$stmt->execute([$username, $email, $hash]);
그리고 로그인시 :
$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute([$_POST['username']]);
$users = $result->fetchAll();
if (isset($users[0]) {
if (password_verify($_POST['password'], $users[0]->password) {
// valid login
} else {
// invalid password
}
} else {
// invalid username
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다