Php login sigurnost

Pozdrav. Na netu ima more tema o tome kako napraviti “sigurniji” login u php-u. Ali sve ima svoje mane i nedostatke. Ako moze savjeti/prijedlozi na kod koji cu pastirati ispod. Hvala.

<?php

session_start();

require_once('mysql.inc.php');

$username = $_POST['username'];
$password = $conf_hash_function($_POST['password']);

$query = $mysqli->stmt_init();
$query->prepare("SELECT id, name, surename FROM workers WHERE username = ? AND password = ?");
$query->bind_param("ss", $username, $password);
$query->execute();
$query->store_result();

if ($query->num_rows == 0) 
{
	header("Location: login.html.php?error=1");
}
else
{
	$query->bind_result($id, $name, $surename);
	$query->fetch();
	$query->close();
	
	$_SESSION['worker_id'] = $id;
	$_SESSION['name_surename'] = $name.' '.$surename;
	header("Location: index.php");
}

?>

mysql.inc.php - sadrzi connect query
$conf_hash_function = sha1, definisano u config fajlu.

Naravno, ideja je da ne bude 1000 linija koda samo za login.

Mala checklista za login (i inace stvari koje trebaju bit osigurane):

  1. Uvijek al bas UVIJEK stavi sve takve stvari pod SSL (self-signed moze, bitno da je enkriptovano), provjeri ako nije ssl i odma ubij taj attempt (die(“Needs more SSL”))
  2. Nije losa ideja imat neki anti-bot mehanizam tipa captcha al ne moras je stavit by default nego ako neko ima 3 failed login attempta
  3. Ako moguce generisi nonce za takve URLove (http://en.wikipedia.org/wiki/Nonce)
  4. Uvijek snimaj hash passworda u bazu (recimo SHA1 ili ljepse SHA256 i iznad)
  5. Ukoliko moguce, snimaj kad se ko logiro i sa kog IPa (il recimo zadnjih 10-15 logina) pa koristi GeoIP metode da vidis jel se zemlja promijenila, ako jest posalji covjeku mail da se logiro neko iz tajvana na njegov account
  6. Dok PDO ce fino to quoteat vidi da skines sve tagove iz polja radi XSSa (http://www.php.net/manual/en/function.strip-tags.php)

Vjerovatno ima jos stosta sto se moze uradit al eto oto su kao neke osnove.

Thx! O ovom za XSS sam citao to sam mislio svakako dodati. Ovo ostalo cu probati.

Hvala jos jednom.

Zaboravi na jednoprolazne hash funkcije za šifre, treba ti HMAC, a da ne bi izmišljao toplu vodu koristi:

http://www.openwall.com/phpass/

(Provjeri listu projekata koji koriste phppass!)

Stoji savjet za SSL i login, odnosno koristi Secure Cookies i sl (http://en.wikipedia.org/wiki/HTTP_cookie#HttpOnly_cookie)
Pored nefiltriranog korisničkog inputa, veliki broj problema na današnjim web aplikacijama dešava se zbog naivnog korištenja cookija (neenkriptovani cookiji sa lako pogodljivim kritičnim vrijednostima, npr. da u cookie snimite “is_admin=1”)
Treća klasa problema dešava zbog javascript-a i “mashupa” javascript biblioteka sa raznih URL-ova, rušeći i privid sigurnosti koji nudi “same origin” javascript policy.

P.S.
Pročešljaj dobro resurse na: https://www.owasp.org/ npr.

https://www.owasp.org/index.php/Clickjacking
https://www.owasp.org/index.php/List_of_useful_HTTP_headers
https://www.owasp.org/index.php/SecureFlag
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29

Nisam znao za ovaj phppass, definitifno cu pogledati (sad sam samo preletio preko teksta). Sa kukijima nisam bas ni vjest, ali mislim da ih necu ni koristiti za sada. Pogledacu i ovo ostalo.

Hvala puno.