[ phpnewserb @ 12.09.2015. 14:27 ] @
Novajlija sam i tek sto sam zavrsio php developer kurs. To sto sam zavrsio kurs ne znaci da znam da programiram u php-u. Zanima me kako da razvijem bez upotrebe fw-ova login a i register pristup sajtu uz svu manipulaciju kroz sajt(web aplikaciju). Ja cu probati ovde da razvijam nesto a nadam se da cete prakticnim sugestijama ucestvovati u razvijanju login/register-a. Zelim mi puno uspeha : )))).
[ phpnewserb @ 12.09.2015. 14:34 ] @
Evo mog prvog pokusaja. Znam da je neozbiljno sa moje strane ali kontam da odnekud moram poceti:

sam log-in

<?php

//prvo par funkcijica koje mogu posle da koristim


// Parametri za konekciju na bazu
DEFINE ('HOST', 'localhost');
DEFINE ('USER', 'root');
DEFINE ('PASS', '');
DEFINE ('DB', 'app');


// Funkcija za konektovanje na bazu
function doDB() {
global $dbcon;

$dbcon = @mysqli_connect(HOST, USER, PASS, DB);

if(mysqli_connect_errno()) {
$errorPorZaUsera = "Doslo je do greske pri konektovanju na bazu,
Molimo vas kontaktirajte administratora.";
$errorDijagnoza = "Sistemska greska pri konektovanju: ".mysqli_connect_error();
handle_error($errorPorZaUsera, $errorDijagnoza);
}

mysqli_set_charset($dbcon, 'utf-8');
}

// Error handler
DEFINE('DEBUG_MODE', true);

function debug_print($message) {
if(DEBUG_MODE) {
echo $message;
}
}

function handle_error($user_error_message, $system_error_message) {
session_start();
$_SESSION['error_message'] = $user_error_message;
$_SESSION['system_message'] = $system_error_message;
header("Location: error.php");
}

// Funkcija za preciscavanje user input-a to jest sprecavanja sql injection napada
function clean($dbcon, $param) {
global $dbcon;
$cleaned = mysqli_real_escape_string($dbcon, strip_tags(trim($param)));
return $cleaned;
}

// a sad na posao, ajde da se logujem

if($_SERVER['REQUEST_METHOD'] == 'POST') { // Ukoliko je forma prosledjena
doDB(); // Konektujemo se na bazu
$errors = array(); // Inicijalizujemo errors niz

// Uzimanje i provera parametara iz forme
if(!empty($_POST['email'])) {
if ( !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false ) {
$email = clean($dbcon, $_POST['email']);
} else {
$errors[] = '<p class="error">Molimo Vas, unesite EMAIL u pravilnom formatu';
}
} else {
$errors[] = '<p class="error">Molimo Vas, popunite polje EMAIL.';
}

if(!empty($_POST['pass'])) {
$pass = clean($dbcon, $_POST['pass']);
} else {
$errors[] = '<p class="error">Molimo Vas, popunite polje PASSWORD.';
}

// Provera da li ima errora
if(empty($errors)) { // Ukoliko nema errora
// Proveravamo da su login podaci ispravni
$q = "SELECT k_id, korisnickoIme, nivo FROM korisnici WHERE (email = '{$email}' AND sifra = SHA1('{$pass}'))";
$rezultat = @mysqli_query($dbcon, $q);
if (mysqli_num_rows($rezultat) == 1) {
session_start();
$_SESSION = mysqli_fetch_array($rezultat, MYSQLI_ASSOC);
$_SESSION['nivo'] = (int) $_SESSION['nivo']; // Typecasting, osiguravamo se da je level INT vrednost
header("Location: index.php"); // Redirektujemo usera na njegov CP
} else {
handle_error("Ne moze da Vas ulogujemo. Podaci nisu ispravni. Molimo Vas pokusajte ponovo!");
}
mysqli_close($dbcon);
} else { // Ima errora
echo '<h1 class="error">Doslo je do greske:</h1>';
foreach($errors as $msg) {
echo "$msg";
}
// Zatvaramo konekciju sa bazom
mysqli_close($dbcon);
}


} else {
handle_error('Ilegalan pristup stranici. Morate to uraditi preko forme.') ;
}
?>
[ phpnewserb @ 12.09.2015. 15:58 ] @
Evo jednog kolege odgovorio mi je na drugom forumu nesto, uglavnom oko nacina kako bi on pravio konekciju na bazu

<?php

session_start();

// Setting up the globals

$GLOBALS['config'] = array(
'mysql' => array(
'host' => '127.0.0.1',
'username' => 'root',
'password' => '',
'db' => 'project'
),
'remember' => array(
'cookie_name' => 'hash',
'cookie_expiry' => 604800
),
'session' => array(
'session_name' => 'user'
)
);

// Setting up the autoload

spl_autoload_register(function($class) {
require_once 'classes/' . $class . '.php';
});

[ Predrag Supurovic @ 12.09.2015. 23:08 ] @
Pomozi sebi i korsiti PDO, isplatice ti se.

Inace, nemoj se vezivati za bazu. Da bi razvio login sistem ona ti uopste nije potrebna. Konekcija nabau i pristup podacima o korisnicima treba da bude samo jedan sloj koji je odvojena celina. To resi tako sto ces napraviti posebnu klasu ciji je posao da ti daje podatke o korsinicima i komuniciraj samo sa njom a ne sa bazom direktno.

Dalje, kada proveravas korsinika u bazu NEMOJ u upitu proveravati korsinicko ime i lozinku. Izdvoj slog koji odgovara korisnickom imenu (ako dobijes vise slogova to ti je alarm da nesto nije u radu sa podacima u bazi, verovatno i sa modelom baze) a onda naknadno u kodu proveri da li odgovara i lozinka. Tako ces imati mnogo pouzdaniji i sigurniji sistem.

Napravi posebnu klasu koja ce hendlovati sesiju (ako sesiju definisemo kao skup akcija koje korsinik ima sa sajtom dok je ulogovan) i to kreiranje sesije, gasenje sesije, timeout sesije, promenljive sesije...

Za nivoe je bolje da korsitis sistem uloga (roles) i dozvola (privileges) umesto prostog korisnikog nivoa. Izbecices tako mnoge probleme kasnije.

Usput, gde si zavrsio kurs?
[ phpnewserb @ 13.09.2015. 09:17 ] @
E super si u par reci si mi dao potpuni pravac. ja sam zavrsio na ITAcademy kurs. Sad je na meni da se razvijem u php-u(u samom programiranju). Verujem inace da je sve vec napravljeno i treba da nadjem uspesna resenja, tj bolje je nego da lupam glavu i degradiram sebe. I sama pretraga zahteva puno vremena i uci te svemu i svacemu zar ne...

Evo primera jedne klase, e a sad dali je ona stvarno dovoljna ovakva:

class UserService
{
private $_email;
private $_password;

public function login($email, $password)
{
$this->_email = mysql_real_escape_string($email);
$this->_password = mysql_real_escape_string($password);

$user_id = $this->_checkCredentials();
if($user_id){
$_SESSION['user_id'] = $user_id;
return $user_id;
}
return false;
}

protected function _checkCredentials()
{
$query = "SELECT *
FROM users
WHERE email = '$this->_email'";
$result = mysql_query($query);
if(!empty($result)){
$user = mysql_fetch_assoc($result);
$submitted_pass = sha1($user['salt'] . $this->_password);
if($submitted_pass == $user['password']){
return $user['id'];
}
}
return false;
}
}
[ phpnewserb @ 13.09.2015. 09:31 ] @
Evo malo izmena



class UserService
{
protected $_email; // using protected so they can be accessed
protected $_password; // and overidden if necessary

protected $_db; // stores the database handler
protected $_user; // stores the user data

public function __construct(PDO $db, $email, $password)
{
$this->_db = $db;
$this->_email = $email;
$this->_password = $password;
}

public function login()
{
$user = $this->_checkCredentials();
if ($user) {
$this->_user = $user; // store it so it can be accessed later
$_SESSION['user_id'] = $user['id'];
return $user['id'];
}
return false;
}

protected function _checkCredentials()
{
$stmt = $this->_db->prepare('SELECT * FROM users WHERE email=?');
$stmt->execute(array($this->email));
if ($stmt->rowCount() > 0) {
$user = $stmt->fetch(PDO::FETCH_ASSOC);
$submitted_pass = sha1($user['salt'] . $this->_password);
if ($submitted_pass == $user['password']) {
return $user;
}
}
return false;
}

public function getUser()
{
return $this->_user;
}
}
[ phpnewserb @ 13.09.2015. 09:37 ] @
Onda bi mogli da iskoristimo login prekod PDO:

$pdo = new PDO('mysql:dbname=mydb', 'myuser', 'mypass');

$userService = new UserService($pdo, $_POST['email'], $_POST['password']);
if ($user_id = $userService->login()) {
echo 'Logged it as user id: '.$user_id;
$userData = $userService->getUser();
// do stuff
} else {
echo 'Invalid login';
}

Dali je sve ovo stvarno u upotrebi na ovaj nacin?
[ phpnewserb @ 13.09.2015. 09:42 ] @
Ono sto mene brine u mom nacinu razmisljanja je ustvari moj odnos prema sigurnosti informacija. U poslu se uvek kaze 'Safety First!!!' i mislim da ni ovo nije izuzetak. Safety da bi se osigurala se postize inzinjerima koji su eksperti u toj oblasti pa i inzenjerima koji ce da kontrolisu i traze greske. Tako da mislim da sam ja potpuno nekompetentan za gradjenje login sistema vec bi trebao da nadjem neki open source koji je u najsiroj upotrebi i koji uvek ima 'zakrpe'.

Da li sam u pravu?
[ iGolub @ 13.09.2015. 22:47 ] @
Ja mislim da sama login forma i nije toliko problematična, što se tiče sigurnosti. Validacijom unešenih podataka zaštitiš se od sql injection-a
i ostaje samo još brute-force koliko ja znam, koji možeš da npr. nakon 5 pogrešnih pokušaja staviš captcha.
Ono što ne možeš da braniš je da korisnik sam nekome da šifru. Tako što će da stavi neku "laku" šifru, da se loguje na nekom zaraženom računaru, da je napiše kao status na fb...
Meni je super što pišeš ove stvari i razmišljaš, ali nije relano da ćeš neki veći sistem da praviš 'pješke' bez nekog fw-a gdje su ove stvari super riješene.
[ phpnewserb @ 14.09.2015. 08:33 ] @
Ja mislim da sama login forma i nije toliko problematična, što se tiče sigurnosti. Validacijom unešenih podataka zaštitiš se od sql injection-a
i ostaje samo još brute-force koliko ja znam, koji možeš da npr. nakon 5 pogrešnih pokušaja staviš captcha.
Ono što ne možeš da braniš je da korisnik sam nekome da šifru. Tako što će da stavi neku "laku" šifru, da se loguje na nekom zaraženom računaru, da je napiše kao status na fb...
Meni je super što pišeš ove stvari i razmišljaš, ali nije relano da ćeš neki veći sistem da praviš 'pješke' bez nekog fw-a gdje su ove stvari super riješene.


Kolega jos jednom hvala na komentarima i savetima : ))))
Upravo sigurnost je koncept koji pokusavam da iznesem u ovoj temi. Sad si mi dao teme za razmisljanje...

Ako dobro razumem:

1. brute-force ; to je napad na kriptovan sadrzaj upotrebom sile, pokusavamo sa svim kljucevima i lozinkama koje 'postoje' dok nenadjemo odgovarajuce. Recimo da je ovo deo posla osoba koje rade na testiranju sistema ili je deo zlonamernog napada na sistem... Znaci bolje fw nego ulaziti u tu pricu...

2. a captcha je 'onaj dokaz da nismo robot' upisivanjem simbola sa slike u predvidjeno polje.

Nadam se da sam te dobro razumeo.

U svakom slucaju da nebih besciljno lutao na ovu temu (a ti i jos dvojica ste mi dali upute za fw) nastavicu na ovu temu sa stanovista wordpress-a odnosno zend-a.
[ Tpojka @ 14.09.2015. 12:30 ] @
Pogledaj ovaj serijal kako je odradjena autentifikacija preko Slim OOP pristupa.
[ iGolub @ 14.09.2015. 12:35 ] @
Da, brute-force izvršava skripta koja pokušava razne kombinacije lozinke ali nije u stanju da pročita captcha.
Ja sam na primjer imao problem sa starijim verzijama joomla cms-ova. U par minuta stotine pokusaja logina na administratorski panel.
To sam riješavao tako što sam administratorski folder zaštitio lozinkom na samom apache-u.Pošto je to login za administratore nije mi bio
problem da ih natjeram da se dva puta loguju Probaj na fb ili google da promašiš 3-4 puta šifru, pa vidi kako se oni brane od brute-force-a

fw je definitivno super stvar, kad se 'ušteliš' mnogo će da ti uštedi vremena i olakša život...
Najvažnija stvar je što dobiješ arhitekturu, i tačno se zna gdje se šta nalazi što olakšava timski rad. Kada neko poslije tebe uzme
da održava sajt biće mu lako da se snađe. Možeš da napraviš svoj login kao module za neki fw i onda ga lako implementiraš u svaki svoj projekat.
Ja koristim yii, pa ako slučajno kreneš sa njim tu sam ako šta mogu pomoći.
[ phpnewserb @ 14.09.2015. 19:47 ] @
Hvala vam na odgovorima, potrudicu se da ispratim serijal TPojka pa cu jedan po jedan cod da izbacujem ovde.

Igore za yii prvi put cujem, svakako cu pogledati taj fw. Ja sam mislio da se spremam za Zend ali kontam da i sami fw medjusobom nemogu imati preteranih razlika. Hocu reci trebalo bi da funkcionisu ko mobilni telefoni jer na kraju krajeva se za iste stvari koriste i isto treba i da urade...
[ VladaSu @ 17.09.2015. 15:32 ] @
Citat:
phpnewserb:

Ako dobro razumem:

1. brute-force ; to je napad na kriptovan sadrzaj upotrebom sile, pokusavamo sa svim kljucevima i lozinkama koje 'postoje' dok nenadjemo odgovarajuce. Recimo da je ovo deo posla osoba koje rade na testiranju sistema ili je deo zlonamernog napada na sistem... Znaci bolje fw nego ulaziti u tu pricu...
...

U svakom slucaju da nebih besciljno lutao na ovu temu (a ti i jos dvojica ste mi dali upute za fw) nastavicu na ovu temu sa stanovista wordpress-a odnosno zend-a.


Nije napad na 'kriptovan' sadrzaj i nije sa 'upotrebom sile'. Ne mora biti kriptovan sadrzaj i ne bih rekao upotrebom sile. To nije deo posla osoba koji rade na tesiranju sistema vec je tvoj deo posla.
'Znaci bolje fw nego ulaziti u tu pricu...' Ne znam kako si povezao fw sa ovom pricom. FW nema veze sa ovim.
Wordpress i Zend su nebo i zemlja i nemaju isti priemnu. Wordpress je gotov sajt tj CMS koji podesavas sa klikcanjem i eventualno pravis neki plugin koji vec spada u sferu programiranja ali kada se spominje wordpress onda se ne misli na programiranje plugina.
Zend je framework tj okvir za programiranje koji ima vec uradjenih gomilu stvari i koji je organizovan da bude fleksibilan. Ta gomila uradjenih stvari se NE integrise u sajt klikcanjem vec programiranjem i to ozbiljnim programiranjem.
Vidim da se jos uvek bacas sa pojmovima i nemas jasnu sliku sta je sta ali ako ovako nastavis vrlo brzo ce da ti bude jasnije :)
[ phpnewserb @ 18.09.2015. 18:37 ] @
Iscitavam wordpress i cini mi se da je tipa dobijes manual kako da ga koristis, podesis parametre, budes tek malo kreativan i imas svoj prvi sajt. Napredniji korisnici vec znaju bolje da se snadju sa temama ili da kreiraju svoje i svasta nesto da urade da bi dobili drugaciji sajt. Mada mi se ne cini da nije orijentisan na razvijanje aplikacija.

Kad prodjem vise sa wordpressom preci cu i na zend. O5 sve ovo sa wordpressom je daleko od programiranja vise stelovanje, zend cu videti vec...