bindParam löser eventuella SQL-injections, så länge du inte låter användarna specificera ASC eller DESC sorteringar.
Det går att använda HTML Purifier för att validera html, om man måste skriva ut det på sidan (utan htmlspecialchars). Annars _ska_ man alltid använda htmlspecialchars($str, ENT_QUOTES, "UTF-8") innan man skriver ut någonting i webbläsaren som en användare har skrivit. Självklart går det att kombinera med filter_var för att t.ex. validera e-post* eller ta bort alla html taggar**. Dock är det inte skadligt att spara i databasen, så länge man använder htmlspecialchars eller htmlentities vid utskrift.
Är ju inte så vanligt att man använder < eller > i användarnamn direkt. Men filter_var känns mer användbar för att kontrollera siffror, url och e-post.
Ska du skriva ut användardata inuti inputfält måste du stänga/öppna citaten:
<input name="test" type="text" value="<?php htmlspecialchars($str, ENT_QUOTES, "UTF-8"); ?>" />
Du bör även specificera att din databas använder utf8mb4 (version >=5.5.3) och utf8 för PHP, för att få rätt teckenformat. Dina filer ska även använda UTF8 utan BOM.
Personligen väljer jag att kasta bort människor och inte skriver ut en separat text.
if(!isset($_SESSION['user_id'])) { header('Location: login.php'); }
Bara så du vet så klipper password_hash alla lösenord efter 72 tecken. Du kan kringå det genom att först köra en sha kryptering på lösenordet och köra en base64 encode över den. För att sedan hasha och salta med bcrypt.
/**
* Verify users password against the one stored in the database.
* @param string $password
* @param string $userPassword
* @return verified password true/false
*/
public function passwordVerify($password,$userPassword) {
return password_verify(
base64_encode(
hash('sha384', $password, true)
),
$userPassword
);
}
/**
* Hash users password before storing it in the database.
* @param string $password
* @return hashed password
*/
public function passwordHash($password) {
return password_hash(
base64_encode(
hash('sha384', $password, true)
),
PASSWORD_DEFAULT
);
}
EDIT: Glömde nämna att du inte har någon CSRF-skydd.
EDIT2: En matnyttig länk:
https://www.wordfence.com/learn/how-to-prevent-cross-site-scr...
*FILTER_VALIDATE_EMAIL
**FILTER_SANITIZE_STRING