不要相信任何來自不受自己直接控制的資料來源的資料———福克斯·馬爾德
我們在使用
$_GET
$_POST
$_REQUEST
$_COOKIE
$argv //獲取傳遞引數的數量 和 argv 獲取傳遞引數的值
php://stdin // 標準輸入(standard input),只讀,用於從控制檯輸入內容;
php://input // 可以訪問請求的原始資料的只讀流,既可以讀取到POST上沒有經過解析的原始資料
file_get_contents();
···
所有這些外部資料來源都可能是攻擊媒介,可能會將惡意資料注入PHP指令碼,雖然編寫接收使用者輸入資料的指令碼很簡單,但首先我們要在實現業務的前提下也要保證資料的一致性和安全性
大家都知道現在為止已經有很多過濾方法,如正規表示式、htmllentities()、htmlspecialchars()、sprintf() 等等。但是這些方法不是效率慢就是有漏洞,2021了 不推薦大家使用
我們可以通過filter_var()、和filter_input()來獲取
如驗證郵箱可以使用
$email = "admin@admin.com";
$isEmail = filter_var($email,FILTER_VALIDTE_EMAIL);
if($isEmail !== false){
echo 'success';
}else{
echo 'error';
}
註冊使用者可以使用
<?php
try{
// 驗證郵箱
$email = filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL);
if(!$email){
throw new Exception('Invalid email');
}
// 驗證密碼
$password = filter_input(INPUT_POST,'password');
if(!$password || mb_strlen($password) < 8 ){
throw new Exceptio('必須輸入8位以上的密碼');
}
// 建立密碼的雜湊值
$passwordHash = password_hash(
$password,
PASSWORD_DEFAULT,
['cost' => 12]
);
if($passwordHash === false){
throw new Exception('Password hash failed');
}
// 建立賬戶
$user = new User();
$user->email = $email;
$user->password_hash = $passwordHash;
$user->save();
// 註冊成功,重定向到登入頁面
header('HTTP/1.1 302 Redirect');
header('Location:/login.php');
}catch(Exception $e){
echo $e->getMessage();
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結