Надёжен ли данный код?

shift_on_line

Новичок
Надёжен ли данный код?

Здравствуйте, у мня вопрос: Надёжен ли данный код (Аутентификация), можно ли обойти эту защиту? (если да то как устранить).

PHP:
<?
//error_reporting(0);
session_start();
session_register("SESSION");

if (! isset($SESSION)) {
$SESSION = array();
}

if($exit=='yes') {
unset ($SESSION["password"]);
unset ($SESSION["username"]);
}

$user = htmlspecialchars(addslashes($user));
if($enter) {
$SESSION["username"] = $user;
$SESSION["password"] = md5($pass);
}

$username = $SESSION["username"];
$password = $SESSION["password"];
$aunt= '';

if(!empty($password)) {
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
include("config.php");
$db=@mysql_connect($bdhost,$bdlogin,$bdpass);
@mysql_select_db($bdname,$db);
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 $login = @mysql_query("SELECT *  FROM `$bazuser` WHERE `nick` = '$username' AND `pass` = '$password'");
  if (@mysql_num_rows($login) == 0) {echo "<font color=red><center>В доступе отказано!</center></font><br>";
        unset ($SESSION["password"]);
        unset ($SESSION["username"]);}
     else {while ($myrow=mysql_fetch_array($login))
           {
           $imia =$myrow["imia"];
           $familia =$myrow["familia"];
           $sity =$myrow["sity"];
           $email =$myrow["email"];
           $money =$myrow["money"];
           $id_user =$myrow["id"];
           $sid =$myrow["sid"];
           }
           $aunt= 'no';
          //====
          $data = date("Y/m/d");
          $sql = "UPDATE `$bazuser` SET `data` ='$data', `ip` ='$REMOTE_ADDR' WHERE `id` = '$id_user'";
          $upSID=@mysql_query($sql,$db);
          //====
          echo "<center>Здравствуйте $imia!<br>";

     };
}

if(empty($aunt)) {
       Echo "
        <center>
        <form method=post action=$PHP_SELF>
        <h3 style='color:red'>Аутентификация пользователя</h3>
        <table align=center border=0>
        <tr>
                <td align=center colspan=2><b>Пожалуйста, введите логин и пароль</td>
        </tr>
        <tr>
                <td align=right>Login:</td>
                <td><input type=text name=user size=22></td>
        </tr>
                <tr>
                <td align=right>Password:</td>
                <td><input type=password name=pass size=22></td>
        </tr>
        <tr>
                <td align=right></td>
                <td><input type=submit value='Войти ' name=enter>
                <input type=reset value='очистить'>
        </td>
        </tr>

        </table>
        </form>
        ";
        die();
        }
        echo "Работает!<br>
        <a href=$PHP_SELF?exit=yes>Выход из системы . . . .</a>
        <hr>";
?>
 

Demiurg

Guest
1.[m]session_register[/m]
2. Собак всех убрать.
3. Вряд ли кому-то захочется во всем этом разбираться.
 

Фанат

oncle terrible
Команда форума
по крайней мере, он смешной.

по поводу же надежности.
1. оно не будет работать при регистер-глобалс=офф
2. из-за error_reporting(0); ты не увидишь ошибок, что может привести к проблемам в безопасности.
 

Кром

Новичок
>$aunt= 'no';
А это что значит? Типа - тети нет? В таком случае, когда она есть?
И вообще непонятно, зачем здесь сессии?
 

Фанат

oncle terrible
Команда форума
Может как-то упростить.
Для начала почитать PHP FAQ: Сессии. Подробное описание работы и объяснение механизма. и сделать правильную работу с сессиями.
А потом просто убрать бессмысленно повторяющиеся куски кода.

-~{}~ 05.01.05 16:07:

shift_on_line
Ты пришел спросить. Тебе ответили - что оненадежен, что он может не работать.
Ты талдычишь в ответ, что оно работает.
Зачем пришел тогда?
Зачем людей вопросами отвлекать, если ты все равно на ответы кладешь? Ты пришел, чтобы тебя похвалили, или чтобы на ошибки указали?
 

Tn

Guest
shift_on_line: помимо того, что написали выше:
- если magic_quotes_gpc будет выключен, то подумай, что будет если пользователь передаст в $username или в $password значение: ' or '1'='1
поэтому проэкранируй все данные из вне в запросках к БД - addslashes()
 

Фанат

oncle terrible
Команда форума
экранировать, вообще-то, надо данные не только "извне", но и изнутри. Проэкранированы должны быть любые данные, без разницы, откуда они.
 

shift_on_line

Новичок
=-=
Кром писал: >$aunt= 'no';
А это что значит? Типа - тети нет? В таком случае, когда она есть?
И вообще непонятно, зачем здесь сессии?
---
Это типа убрать меню ниже есть f(empty($aunt)) { .....
=-=
Фанат писал: Для начала почитать PHP FAQ: Сессии. Подробное описание работы и объяснение механизма. и сделать правильную работу с сессиями.
А потом просто убрать бессмысленно повторяющиеся куски кода.
---
Я прочитал, надо добавить $SESSION="4to-to"; И зачем, я её не использую..
Что здесь бесслысленного?
-
Если он что я зделаю. я пришёл не выяснить почему он не работет, а узнать можно ли обойти эту защиту, если да то как и как это убрать..
=-=
Tn стоит же $user = htmlspecialchars(addslashes($user));
передовал, нифига :)

=-=
Фанат писал: экранировать, вообще-то, надо данные не только "извне", но и изнутри. Проэкранированы должны быть любые данные, без разницы, откуда они.
--
Всмысле = ''; или = htmlspecialchars(addslashes($peremennaia));
Ты прав, их задать мона хоть откуда...
 

Кром

Новичок
>Это типа убрать меню ниже есть f(empty($aunt)) { .....

То что есть ниже я и сам вижу. Меня интересует, почему тети нет, а меню есть?
 

Tn

Guest
Tn стоит же $user = htmlspecialchars(addslashes($user));
Не там стоит. В скрипте-то зачем тебе прослешенные переменные, ты экранируй в самом запросе.

Упрости код в 3 раза!
 

Wicked

Новичок
1) Имхо данные перед посылкой в запрос лучше экранировать предназначенными именно для этого функциями: mysql_escape_string() или mysql_real_escape_string().

2) The PHP directive magic_quotes_gpc is on by default, and it essentially runs addslashes() on all GET, POST, and COOKIE data. Do not use addslashes() on strings that have already been escaped with magic_quotes_gpc as you'll then do double escaping. The function get_magic_quotes_gpc() may come in handy for checking this.

Более, того, зачем такое избыточное экранирование в запросе еще и с использованием htmlspecialchars? :)
PHP:
$user = htmlspecialchars(addslashes($user));
...
$SESSION["username"] = $user; 
...
$login = @mysql_query("SELECT *  FROM `$bazuser` WHERE `nick` = '$username' AND `pass` = '$password'");?>

3) Если $exit == 'yes', то в послед. коде:
PHP:
$username = $SESSION["username"];
$SESSION["username"] не определено. Это тянет на нотис :)

4)
PHP:
$data = date("Y/m/d"); 
$sql = "UPDATE `$bazuser` SET [b]`data` ='$data'[/b], `ip` ='$REMOTE_ADDR' WHERE `id` = '$id_user'";
Я бы лучше заюзал NOW(), если время на mysql-сервере то же;

5) Зато htmlspecialchars() как раз пригодилась бы например вот тут:
PHP:
$imia =$myrow["imia"];
echo "<center>Здравствуйте $imia!<br>";
6) IMHO (!), лучше было бы разбить select на 2 запроса:
SET @pass_md5 = '$pass';
SELECT ... WHERE `pass`= @pass_md5 ...;

7) Используй какой-нть SALT при использовании md5.

Это что с ходу в голову пришло ;)

Мой вердикт: подлежит переписке с нуля %)
 

shift_on_line

Новичок
Кром > Какой тети? она просто задаётся как какоето "no"? а изначально она пустая...
=-=-
Tn > Всмысле? непонял..
=-=-
Wicked пасибо.
1) я отличия от addslashes невижу..
остальные учту..
6)И зачем?
7) кого?
Вердикт: Может поможешь осуществить :)
 

Wicked

Новичок
Originally posted by shift_on_line
Wicked пасибо.
1) я отличия от addslashes невижу..
остальные учту..
6)И зачем?
7) кого?
Вердикт: Может поможешь осуществить :) [/B]
1)
mysql_escape_string() -- Escapes a string for use in a mysql_query().
addslashes() -- Quote string with slashes.
Назначение у них разное. То, что они может быть выполняют одно и то же - это частный случай.

6) Ну первый запрос практически ни от чего не зависит и практически всегда выполняется без ошибок.
Второй же запрос зависит от наличия таблиц, полей в таблице и т.д. и т.п. В случае если он окажется ошибочным, он может попытаться свой текст выдать юзеру, записать в логи,... В этом случае в нем будет присутствовать md5 в чистом виде. А это плохо.

Еще потом неплохо переменную @pass_md5 обнулить.

7)
PHP:
$pass = md5("123");
гораздо проще сломать, чем
PHP:
$salt = "piun20347bflkjahs08d7fho2i3h";
$pass = md5(md5("123").md5($salt));
Почему - читай http://passcracking.com/
About:

This project is dedicated to crack md5 hashes online through web interface. At the moment we can crack md5 hashes in this character range: a-z;0-9 [8] which means we can break almost all hashes (99.56%) which are created from lowercase plaintext with letters and/or digits up to length of 8 characters.

[CUT]

NOTE: This project won't be able to break salted md5 hashes which are used in *nix systems in /etc/shadow files. They won't appear in the list. Only "clean" md5 hashes. Read more about technology behind this project in homepage of RainbowCrack!
-~{}~ 05.01.05 19:10:

Originally posted by shift_on_line
Вердикт: Может поможешь осуществить :)
Не-а )
 

Фанат

oncle terrible
Команда форума
в простейшем варианте вся эта гора кода сводится к такому скрипту, в укотором нет ничего лишнего:
PHP:
<? 
if (isset($_POST['user_name'])) {
  include 'conn.php';
  $username=(get_magic_quotes_gpc())?$_POST['user_name']:addslashes($_POST['user_name']);
  $password=(get_magic_quotes_gpc())?$_POST['user_pass']:addslashes($_POST['user_pass']);
  $query="SELECT * FROM `users` WHERE `name` = '$username' AND `pass` = '$password'";
  $res=mysql_query($query); 
  if (mysql_num_rows($res)) {
    session_start();
    $_SESSION['authorized']=1;
    header("Location: ".getenv('REQUEST_URI')); 
    exit; 
  }
} 
if (isset($_REQUEST[session_name()])) session_start();
if (empty($_SESSION['authorized'])) {
?> 
<form action="<? echo getenv('REQUEST_URI')?>" method="POST"> 
Name: <input name="user_name" type="text" length="10"><br> 
Pass: <input name="user_pass" type="password" length="10"><br> 
<input type="submit"> 
</form>
<? 
  exit;
}
?>
в закрываемом скрипте пишется одна строчка -
<? require 'auth.php'?>

Далее - выходы, мд5, запись в сессию имени и других данных юзера (но не пароля, конечно же), запорочки с сидом, запоминание куками, проверка на айпи и так далее - дописывается по потребности.
 

SiMM

Новичок
SID забыли в Location прописать - сессия может и не стартануть ;)
PS: ликбеза для - почему getenv, а не $_SERVER?
PPS: если заморочки с SID'ом специально опущены - прошу прощения ;)
 

Фанат

oncle terrible
Команда форума
про Getenv ничего определенного сказать не могу. исторически сложилось.
Да, специально опущены.
Можно ведь скрывать начальный сид из адреса для тех, у кого куки работают.
можно просто отказаться от сида по причинам безопасности.
Это уже дополнения.
 
Сверху