Vinnaren i pepparkakshustävlingen!
2021-02-26, 10:01
  #1
Medlem
Jag har utgått ifrån följande projekt
https://phppot.com/php/user-registra...code-download/

Märkte dock att det inte validerar eller saniterar utan stoppar in $_POST["email"] direkt efter prepare.

Om jag ska använda php funktionen php_var() var hade ni använt den i projektet? Vad tror ni om att använda den överst i funktionen registerMember? Eller var hade ni haft det?

Jag har gjort om nedan så jag har runt 20 input fält i mitt formulär som postas till registerMember.



Kod:
public function registerMember()
    {
        
$isUsernameExists $this->isUsernameExists($_POST["username"]);
        
$isEmailExists $this->isEmailExists($_POST["email"]);
        if (
$isUsernameExists) {
            
$response = array(
                
"status" => "error",
                
"message" => "Username already exists."
            
);
        } else if (
$isEmailExists) {
            
$response = array(
                
"status" => "error",
                
"message" => "Email already exists."
            
);
        } else {
            if (! empty(
$_POST["signup-password"])) {

                
// PHP's password_hash is the best choice to use to store passwords
                // do not attempt to do your own encryption, it is not safe
                
$hashedPassword password_hash($_POST["signup-password"], PASSWORD_DEFAULT);
            }
            
$query 'INSERT INTO tbl_member (username, password, email) VALUES (?, ?, ?)';
            
$paramType 'sss';
            
$paramValue = array(
                
$_POST["username"],
                
$hashedPassword,
                
$_POST["email"]
            );
            
$memberId $this->ds->insert($query$paramType$paramValue);
            if (! empty(
$memberId)) {
                
$response = array(
                    
"status" => "success",
                    
"message" => "You have registered successfully."
                
);
            }
        }
        return 
$response;
    } 
Citera
2021-02-26, 10:26
  #2
Medlem
SockAccounts avatar
Jag rekommenderar att du delar upp funktionen i flera delar.

Du har olika funktioner/metoder för att sanitera inkommande värden.
Du har en funktion för att registrera efter sanitering.
Du har en som hanterar dessa.

osv

annars kommer du få en enorm funktion som du inte kan återanvända.

Så dela upp dem olika sakerna du behöver göra i steg.
Skriv enskilda funktioner som gör just det steget
Sedan så klistrar du ihop dem.
Citera
2021-02-26, 11:08
  #3
Medlem
Citat:
Ursprungligen postat av SockAccount
Jag rekommenderar att du delar upp funktionen i flera delar.

Du har olika funktioner/metoder för att sanitera inkommande värden.
Du har en funktion för att registrera efter sanitering.
Du har en som hanterar dessa.

osv

annars kommer du få en enorm funktion som du inte kan återanvända.

Så dela upp dem olika sakerna du behöver göra i steg.
Skriv enskilda funktioner som gör just det steget
Sedan så klistrar du ihop dem.

Kan du ge ett exempel hur du menar istället för som jag tänker? Nedan är exempel på bara 5 input och håller med om ifall jag gör så med 20 input kommer funktionen bli enorm.
Kod:
public function registerMember() { 
$senderName "";
$senderCompany "";
$senderEmail "";
$phoneNumber "";
$departmentEmail "";

if (!empty(
$_POST['sender_email'])) {
    
$senderEmail str_replace(array("\r""\n""%0a""%0d"), ''$_POST['sender_email']);
    
$senderEmail filter_var($senderEmailFILTER_VALIDATE_EMAIL);
}
if(!empty(
$_POST['sender_phone_number'])) {
    
$phoneNumber filter_var($_POST['sender_phone_number'], FILTER_SANITIZE_NUMBER_INT);
}
if(!empty(
$_POST['sender_company'])) {
    
$senderCompany filter_var($_POST['sender_company'], FILTER_SANITIZE_STRING);
}

if (!
trim($_POST["department_email"] == '')) {
    
$departmentEmail str_replace(array("\r""\n""%0a""%0d"), ''$_POST['department_email']);
    
$departmentEmail filter_var($departmentEmailFILTER_VALIDATE_EMAIL);
}
//Resten av koden från mitt första inlägg
//senderName senderCompany etc använder jag sedan i min prepare statement,  $paramValue = array( 
__________________
Senast redigerad av help 2021-02-26 kl. 11:15.
Citera
2021-02-26, 12:07
  #4
Medlem
SockAccounts avatar
Tänk lite så här

Kod:
<?php
public function notEmpty($string) { 
    return !empty(
$string);
};

public function 
sanitizeEmail($string) { 
    return 
filter_var(str_replace(array("\r""\n""%0a""%0d"), ''$string), FILTER_VALIDATE_EMAIL);
};

public function 
sanitizePhone($string) { 
    return 
filter_var($stringFILTER_SANITIZE_NUMBER_INT);
};
public function 
sanitizeCompany($string) { 
    return 
filter_var($stringFILTER_SANITIZE_STRING);
};

public function 
handleInput($post) { 
    
$data = array();

    if(isset(
$post['sender_email']) && notEmpty($post['sender_email'])){
        
$data['senderEmail'] = sanitizeEmail($post['sender_email']);
    } else {
        
$issues['sender_email'] = "Email not set";
    };

    if(isset(
$post['sender_phone_number']) && notEmpty($post['sender_phone_number'])){
        
$data['phoneNumber'] = sanitizePhone($post['sender_phone_number']);
    } else {
        
$issues['sender_phone_number'] = "Phone not set";
    };

    if(isset(
$post['sender_company']) && notEmpty($post['sender_company'])){
        
$data['senderCompany'] = sanitizeCompany($post['sender_company']);
    } else {
        
$issues['sender_company'] = "Company not set";
    };

    if (!
trim($_POST["department_email"] == '')) { // vad gör du här???
        
$data['departmentEmail '] = sanitizeEmail($post['department_email']);
    } 
    
    if (
$this->isUsernameExists($post["username"])) {
        
$issues['username'] = "username exists";
    } else if (
$this->isEmailExists($post["email"])) {
        
$issues['email'] = "email exists";
    }

    if (empty(
$post["signup-password"])) {
        
$issues['signup-password'] = "no password!";
    }

    return array( 
        
"data" => $data
        
"issues" => $issues
    
);
}

public function 
main($string) { 
    
$status true;
    
$memberId false;
    
    
$input handleInput($_POST);

    if(
count($input['issues']) > 0){
        
$status false;
    } else {
        
$memberId registerMember($input['data']);
    }

    if(
$status && notEmpty($memberId)){
        
$response = array(
            
"status" => "success",
            
"message" => "New member inserted"
        
);
    } else {
        
$response = array(
            
"status" => "failed",
            
"message" => "New member failed!"
        
);
    };

    return 
$response;
};

public function 
registerMember($data) { 
    
$hashedPassword password_hash($data["signup-password"], PASSWORD_DEFAULT);
    
$query 'INSERT INTO tbl_member (username, password, email) VALUES (?, ?, ?)';
    
$paramType 'sss';
    
$paramValue = array(
        
$data["username"],
        
$hashedPassword,
        
$data["email"]
    );
    return 
$this->ds->insert($query$paramType$paramValue);;
};

Koden är inte perfekt, men åt det hållet
__________________
Senast redigerad av SockAccount 2021-02-26 kl. 12:09.
Citera
2021-02-26, 14:04
  #5
Medlem
filter_var_array() borde kunna vara användbar när det börjar bli några rader och olika data.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback