2012-01-06 2 views
0

сценарий: в доме веб-сервер работает apache2, вот виртуальные хосты:Войти сценарий - метод обзора

< domain.com - для общественности, WordPress сайт

< employee.domain.com - для сотрудников только, необходимо войти в аккаунт, без WordPress сайта

посещения сотрудника employee.domain.com/page1.php

//page1.php 
session_start(); 
if (isset($_SESSION['username'])) 

{ <page displayed here> } 
else 
{ 
$_SESSION['redir_after_auth'] = $_SERVER['PHP_SELF']; 
header('Location: http://domain.com/login?sid='.session_id()); 
} 

в домене domain.com/login, все переменные $ _SESSION восстанавливаются, а затем auth. продолжается. В случае успеха сотрудник перенаправляется обратно туда, где они пытались посетить, employee.domain.com/page1.php. Теперь, поскольку $ _SESSION ['username'] установлен, будет загружаться page1.php.

//domain.com/login 
<?php 
//check for session_id (sid) and attempt to restore $_SESSION variables that were set at employees.domain.com 
if (isset($_GET['sid']) && trim($_GET['sid']) != '') { 
session_id($_GET['sid']); 
} 
session_start(); 
date_default_timezone_set('America/city'); 
$date = date('l jS F Y h:i A T'); 
$hostname = 'localhost'; 
$dbname = 'employees'; //no, these are not the real values 
$username = 'sql_username'; //no, these are not the real values 
$password = 'password'; //no, these are not the real values 
mysql_connect($hostname, $username, $password) or DIE('Connection to host is failed, perhaps the service is down!'); 
mysql_select_db($dbname) or DIE('Database name is not available!'); 

if(isset($_POST['username'])){ 
if(isset($_POST['password'])){ 

    $login = mysql_query("SELECT * FROM users WHERE (username = '" . mysql_real_escape_string($_POST['username']) . "') and (password = '" . mysql_real_escape_string(md5($_POST['password'])) . "')"); 
    $num_results = mysql_num_rows($login); 


    if ($num_results == 1){ 
     $_SESSION['username'] = $_POST['username']; 
     $_SESSION['password'] = $_POST['password']; 
     while ($row = mysql_fetch_assoc($login)){ 
      $_SESSION['priv'] = $row['priv']; 
      $_SESSION['email'] = $row['email']; 
     } 
     $tbl_name2="access_log"; 
     $user = $_POST['username']; 
        //lets record logins in mysql for later review 
     $addrecord = mysql_query("INSERT INTO $tbl_name2 (id, username, date) VALUES ('','$user','$date')"); 
     if(isset($_SESSION['redir_after_auth'])){ 

      header('Location: http://employees.domain.com' . $_SESSION['redir_after_auth']); 
      die(); 
     } 
     else { 
      header('Location: http://employees.domain.com?sid=' . session_id()); 
      unset($_SESSION['$num_results']); 
      die(); 
     } 
    } 
    else { 
     ?> 
     <table align="center"> 
     <tr><td align="center"> 
     <p style="color:#F00"> 
     <?php echo 'Incorrect Username or Password'; ?> 
     </p> 
     </td></tr> 
     </table> 
     <?php 
    } 
} 
} 
?> 

//this is actually a shortcode in wordpress, hence the html login form here 
<div> 
<form action="" method="POST"> 
<table align="center"> 
<tr><td align="left">Username: </td><td align="left"><input type="text" name="username"></td></tr> 
<tr><td align="left">Password: </td><td align="left"><input type="password"   name="password"></td></tr> 
<tr><td align="left"><input type="submit" value="Login"></td></tr> 
</table> 
</form> 
</div> 

Существует не чувствительно к регистру информации о employees.domain.com, просто календарь компании, формы, ЭСТ ... но, как надежен этот метод? Он открыт для www, поэтому я немного нервничаю.

мысли, предложения?

спасибо!

редактировать:

забыл добавить, пароли, зашифрованные MD5 в MySQL

+0

Если вы пришлете мне в ПМ с именем пользователя/паролем, я попробую его с www и скажу вам, если он достаточно безопасен: p – tryme

+1

Может быть лучше на [CodeReview.SE] (http://codereview.stackexchange.com/) ... – Gumbo

ответ

0

Вы должны иметь страницы аутентификации на employee.domain.com вместо domain.com, если его только ваших сотрудников вы будете использовать функциональность входа. Насколько я понимаю, вы хотите, чтобы ваша сессия была действительной только на employee.domain.com. Таким образом, куки (и сеанс) установлен для employee.domain.com будут отличаться от domain.com

Кроме того, следующий код оставляет простор для session fixation атак:

$_SESSION['redir_after_auth'] = $_SERVER['PHP_SELF']; 
header('Location: http://domain.com/login?sid='.session_id()); 
+0

спасибо. Думаю, это имеет смысл. Мое начало. план заключался в том, чтобы сделать 1 стоп-магазин, domain.com для всех сотрудников, клиентов и общественности. Если бы я переместил логин авторизации. для employee.domain.com, мне не нужно было бы передавать sid по URL-адресу, тем самым удаляя атаку фиксации сеанса? – dan

+0

Это точно. Вам не нужно будет передавать sid по URL-адресу, и тогда не будет возможности атаки на фиксацию сеанса. Идентификатор вашего php-сеанса будет отличаться для двух доменов, но в соответствии с вашим требованием, так как вы не требуете функций входа в домен.com, вы должны быть хорошо с этой настройкой. – CodeExpress

Смежные вопросы