Я немного поигрался - возможно, это может вам немного помочь. Я проверил это, и здесь все выглядит нормально. Несколько замечаний: - не пытайтесь получить sh пароль пользователя, используя MD5
- он считался "broken"
в течение нескольких лет, и существуют обширные словари известных хэшей, которые можно использовать для идентификации пароля. . Кроме того, несмотря на использование mysqli_real_escape_string
, все еще существует потенциальная опасность внедрения SQL из-за встроенных переменных, и также возможно, что mysqli_real_escape_string
изменит значение определенных строк, что может несколько усложнить ситуацию, поэтому вам будет рекомендовано использовать prepared statements
со связанными переменными.
В коде есть комментарии, которые тоже могут помочь.
<?php
try{
/*
it is more important to know whether or not the fields that are used
in the SQL are present in the POST array than it is to know if the
button has been pressed. It is possible to bypass the form afterall!
*/
if( isset(
$_POST['fullname'],
$_POST['phone'],
$_POST['username'],
$_POST['email'],
$_POST['password'],
$_POST['confirmpassword']
)){
if( $_POST['password']!==$_POST['confirmpassword'] )throw new Exception('Passwords do not match');
require 'config.php';
$root=$_SERVER['DOCUMENT_ROOT'];
$tmp=!empty( $_FILES['avatar'] ) ? $_FILES['avatar']['tmp_name'] : false;
$name=!empty( $_FILES['avatar'] ) ? $_FILES['avatar']['name'] : false;
$exts=['gif','png','jpg','jpeg'];
if( $tmp && $name ){
$ext=strtolower( pathinfo( $name, PATHINFO_EXTENSION ) );
if( !in_array( $ext, $exts ) )throw new Exception( sprintf('The file extension "%s" is not allowed', $ext ) );
if( !getimagesize( $tmp ) ) throw new Exception( sprintf('"%s" does not appear to be an image', $name ) );
# The "Current Working Directory" is "/demo/jobs/lib/"
# so the "images" folder is a level UP at "/demo/jobs/images"
chdir( '../' );
$cwd=getcwd();
# The path used to save/move uploaded file
# & should yield a path of the form:
# /home/rainpeyi/public_html/demo/jobs/images/filename.jpg
$savepath = sprintf( '%s/images/%s', $cwd, $name );
# The path to the `demo/jobs` folder
$apppath = str_replace(
array( realpath( $root ), DIRECTORY_SEPARATOR ),
array( '', '/' ),
realpath( $cwd )
);
# & should yield a path of the form:
# /demo/jobs/images/filename.jpg
$displaypath = sprintf( '%s/images/%s', $apppath, $name );
if( is_object( $conn ) && is_uploaded_file( $tmp ) && move_uploaded_file( $tmp, $savepath ) ){
# safe sql statement with placeholders
$sql='insert into `candidates`
( `fullname`, `phone`, `username`, `email`, `pass`, `avatar` )
values
( ?, ?, ?, ?, ?, ? )';
#MD5 is broken.. do NOT use for password hashing, ever!
$hash=password_hash( $_POST['password'], PASSWORD_DEFAULT );
# create the `prepared statement` object & bind variables to placeholders
$stmt=$conn->prepare( $sql );
$stmt->bind_param('ssssss', $_POST['fullname'], $_POST['phone'], $_POST['username'], $_POST['email'], $hash, $displaypath );
$result=$stmt->execute();
$rows=$stmt->affected_rows;
if( !$result or $rows==0 )throw new Exception( 'Unable to add user' );
else {
# all good.. user added, image saved
# redirect user
session_start();
$_SESSION['message'] = "Registration Successful!";
exit( header('Location: user.php') );
}
}else{
throw new Exception('File upload failed');
}
}else{
throw new Exception('Bad foo! No file present');
}
}else{
$tmp=[];
$fields=array(
'fullname',
'phone',
'username',
'email',
'password',
'confirmpassword'
);
foreach( $fields as $field ){
if( !in_array( $field, array_keys( $_POST ) ) )$tmp[]=$field;
}
throw new Exception( sprintf( 'One or more required fields are not present in the POST request!<br />%s', implode( '<br />', $tmp ) ) );
}
}catch( Exception $e ){
exit( $e->getMessage() );
}
?>