Веб-защита страниц доступа, которые должны быть защищены
Я сделал приложение на PHP. Я не являюсь разработчиком ООП, и все, что я знаю, я узнал сам. У меня есть экран входа в систему и файл, который я включаю в начало всех своих файлов. Эти файлы проверяют, авторизован ли пользователь и в порядке ли сеанс, а затем предоставляют доступ, иначе он перенаправляется на страницу входа.
Я думал, что это безопасно, но я использовал Websecurify (дополнение chrome), и это дало мне много ошибок безопасности, которые я должен проверить. Эти ошибки были из php страницы, которые "защищены" с помощью аутентификации по имени пользователя/паролю и сеансовых файлов cookie.
Websecurify получал доступ к формам, размещал данные и многое делал со страницами, которые должны быть защищены. Как я могу защитить свои скрипты от искателей и ботов?
Также websecurify сказал об аутентификации apache = "Приложение использовало аутентификацию WWW. Этот тип аутентификации часто считается небезопасным и уязвимым для целого ряда атак"
.Это правда? Действительно, мне нужна твоя мнение о том, как защитить мои php-скрипты от несанкционированного доступа.
Файл, который я включаю в начало всех php-скриптов, это
session_start();
// set timeout period in seconds
$inactive = 3600;
// check to see if $_SESSION['timeout'] is set
if( isset($_SESSION['timeout']) )
{
$session_life = time() - $_SESSION['timeout'];
if( $session_life > $inactive )
{
session_destroy();
header("location:http://localhost/test/login.php");
}
}
$_SESSION['timeout'] = time();
if( !isset($_SESSION['client']) )
{
header("location:http://localhost/test/login.php");
}
else
{
// authorize user and store some session vars
}
Моя страница входа в систему - это
<?php
session_start();
if($_GET['a']=="logout") {session_destroy();header("location:login.php");}
if(!isset($_SESSION['attempts'])) {$_SESSION['attempts'] = 0; session_commit();}
session_start();
?>
<?php
include_once("vars.php");
include ('mysql_connect.php');
$username=mysql_real_escape_string($_POST["username"]);
$password=mysql_real_escape_string($_POST["password"]);
if($_SESSION['attempts']==4){
echo "<div class=\"error\">You can try one more time.</div>";
}
if($_SESSION['attempts']>4){
// check if blocked username
$sql="SELECT * FROM isec_block WHERE username = '$username' and status=1";
$sql=mysql_query($sql);
$sql_row = mysql_fetch_array($sql);
$allrows = mysql_num_rows($sql);
$nowdate = strtotime(date('Y-m-d H:i:s'));
if($allrows>0){
$db_date = strtotime($sql_row['time_limit']);
if($db_date < $nowdate){
//unblock user
$sql="UPDATE isec_block SET status=0 WHERE username = '$username'";
$sql=mysql_query($sql);
echo "<div class=\"error\">Notice: Your account is open now.</div>";
$_SESSION['attempts'] = 0; session_commit();
session_start();
}else{
$error=1;
echo "<div class=\"error\">Multiple failed login attempts.</div>";
}
}
// eof check if blocked username
$error=1;
if($_SESSION['attempts']>0) echo "<div class=\"error\">ERROR: Ty again in 30 minutes please.</div>";
$ip = $_SERVER['REMOTE_ADDR'];
if($_SESSION['attempts']==5){
// store error login
$sql="INSERT INTO `isec_log` (username,ip,date,status) VALUES ('".$username."','$ip',NOW(),1)";
$result=mysql_query($sql);
// block username for x time
$timeToBuildStructure = 300; // seconds
$now = time(); // current time (seconds since 1/1/1970)
$finishedBuilding = $now + $timeToBuildStructure;
$newdate = date("Y-m-d H:i:s",$finishedBuilding);
$sql="INSERT INTO isec_block (username,time_limit,status) VALUES ('".$username."','$newdate',1)";
$result=mysql_query($sql);
}
$_SESSION['attempts']= $_SESSION['attempts'] + 1;
}
if($username!=="" && $password!=="" && $error<>1)
{
$sql="SELECT * FROM isec_usertable WHERE username='$username' AND password='$password'";
$result=mysql_query($sql);
$row_result= mysql_fetch_assoc($result);
$authenticated = $row_result['username'];
$authenticatedid = $row_result['id'];
$authenitcatedate = $row_result['Lastvisit'];
$authenticatedtype = $row_result['rights'];
$authenticatestatus = $row_result['status'];
$rows=mysql_num_rows($result);
if ($rows==1 and $authenticatestatus==1){
$_SESSION['client']=$authenticated;
$_SESSION['id']=$authenticatedid;
$_SESSION['ldate'] = $authenitcatedate;
$_SESSION['rights'] = $authenticatedtype;
$_SESSION['client_id'] = $row_result['client'];
$_SESSION['isLoggedIn'] = true;
$_SESSION['imagemanager.filesystem.rootpath'] = "../../../../../UserFiles/".$authenticatedid;
// add visit data
$ip = $_SERVER['REMOTE_ADDR'];
$visitdate="UPDATE `usertable` SET Lastvisit=NOW(), visits=visits+1 WHERE id='$authenticatedid'";
$result=mysql_query($visitdate);
// eof visit date
// store error login
$sql="INSERT INTO isec_log (username,ip,date,status) VALUES ('$username','$ip',NOW(),0)";
$result=mysql_query($sql);
header("location:index.php");
} else {
$_SESSION['attempts']= $_SESSION['attempts'] + 1;
//header("location:login.php?er=1");
echo "<div class=\"error\">ERROR: Wrong passoword or inactive account</div>";
$error=1; }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login</title>
<link href="general_css.css" rel="stylesheet" type="text/css" />
</head>
<body><?php if($_GET['er']==1) {echo "<div class=\"error\">ERROR: Wrong password or inactive account</div>";} ?>
<div id="container">
<div id="logo"><img src="template/isec-logogif.gif" width="285" height="64" /></div>
<?php include_once("header-icons.php");?>
<div id="main">
<div class="actionsblock">
<div class="actionheader">Login</div>
<form id="form1" name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
<table width="100%" border="0" cellspacing="5" cellpadding="5">
<tr>
<td width="17%" class="menublock"><div align="right"><a href="pages/clients-add.php"></a><a href="pages/clients.php"></a>Username</div></td>
<td width="17%" class="menublock"><label>
<input name="username" type="text" class="formfield_client" id="username" value="<?php echo $_POST['username'];?>" />
</label></td>
</tr>
<tr>
<td class="menublock"><div align="right">Password</div></td>
<td class="menublock"><input name="password" type="password" class="formfield_client" id="password" /></td>
</tr>
<tr>
<td class="menublock"><div align="right"><a href="myip.php?ip=<?php echo $_SERVER['REMOTE_ADDR'];?>" target="_blank"><img src="template/dot.gif" alt="ip" width="10" height="9" /></a></div></td>
<td class="menublock"><label>
<input type="submit" name="submit" id="submit" value="Connect" />
</label></td>
</tr>
</table>
</form>
</div>
</div>
</div>
</body>
</html>
<?php
mysql_close($dbc);
?>
1 answers
Это крайне небезопасный код. Вы ни в коем случае не препятствуете доступу к какой-либо странице. Вы не хэшируете пароли, и это уязвимо для XSS.
Давайте начнем с контроля доступа:
Функция header()
добавляет произвольный http-заголовок в ответ, но PHP-код выполняется нормально.
Не запрещает доступ ни к чему, он только перенаправляет браузер:
header("location:http://localhost/test/login.php");
Это все равно, что сказать, что эта строка кода предотвращает доступ:
header("Message: Go away!");
Это предотвращает доступ к странице, вызывая die():
header("location:http://localhost/test/login.php");
die();
Векторы Xss:
Echo $_POST['имя пользователя'];
Эхо $_SERVER['PHP_SELF'];
Исправлено:
Специальные символы Echo html($_POST['имя пользователя'], ENT_QUOTES);
Специальные символы Echo html($_SERVER['PHP_SELF'], ENT_QUOTES);