За последние 24 часа нас посетили 16616 программистов и 1677 роботов. Сейчас ищет 841 программист ...

Попинайте новичка в плане безопасности и грамотности кода.

Тема в разделе "PHP для новичков", создана пользователем versia, 27 мар 2009.

  1. versia

    versia Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    15
    Симпатии:
    0
    Добрый день.
    Прошу оценки данного кода в плане безопасности.
    Как работают некоторые операторы кода мне до конца не ясно - но они работают :) и фиг с ними.
    Простейшая авторизация - состоящая из двух файлов - admin.php и обработчик handler.php + еще есть класс class_sql.class в котором и происходит основная обработка.
    Собственно цель была создать простую авторизацию пользователя и получение списка определенных значений для этого пользователя.Пользователи заводятся вручную в БД.
    итак admin.php....

    PHP:
    1. <table width="55%" border="0"  align="left">
    2. <form action="handler.php" method=post>  
    3.   <tr><td height="47"  align="right"><br>
    4. Имя: <input type=text name=name value='user' /><br>
    5.   </tr><tr><td  align="right">
    6. Пароль: <input type=password name=password value='password'><p>
    7. <input type=submit value=Отправить>    
    8.   </tr>
    9. </form>  
    10. </table>
    11.  
    handler.php.....

    PHP:
    1. <?php
    2.  
    3.  require("../class_sql.class");
    4.  $my=new class_sql;
    5.  
    6.  if ($_POST['name'] == '' or $_POST['password'] == '') {
    7.  echo "<div align=center ><strong>Вы не ввели логин или пароль !</strong></div>";
    8.  echo "<HTML><HEAD>
    9.                 <META HTTP-EQUIV='Refresh' CONTENT='0; URL=admin.php'>
    10.                 </HEAD><body>";
    11.  }
    12.  $my->pass();
    13.  
    14. ?>
    и две функции из класса class_sql.class...

    PHP:
    1. function pass() {
    2.   $this->connect();
    3.   $this->sql = "SELECT PASS,CODE,NAME from P where LOGIN = '".$_POST['name']."'";
    4.   $result = db2_exec($this->conn, $this->sql);
    5.   if (!$result)  {
    6.   echo " Ошибка SQl ";
    7.   exit();}
    8.   $stmt = db2_prepare($this->conn, $this->sql);
    9.   db2_execute($stmt, array());
    10.   while (db2_fetch_row($stmt)) {
    11.   $password = rtrim(db2_result($stmt, 0));
    12.   $code = rtrim(db2_result($stmt, 1));
    13.   $fname = rtrim(db2_result($stmt, 2));
    14.   if ($password == rtrim($_POST['password'])) {
    15.   $this->select($code,$fname);
    16.  }
    17. else
    18.  {
    19.   echo "<div align=center ><strong>Авторизация не пройдена!</strong></div>";
    20.   echo "<HTML><HEAD>
    21.        <META HTTP-EQUIV='Refresh' CONTENT='0; URL=admin.php'>
    22.        </HEAD><body>";
    23.   }
    24.  }
    25. }
    26.  
    и


    PHP:
    1. function select($code,$fname) {
    2.   $i=0;
    3.   $this->connect();
    4.   $this->sql = "SELECT CODE,NAME from B where status=$code";
    5.   $result = db2_exec($this->conn, $this->sql);
    6.   if (!$result) {
    7.   echo "У вас нет ...... !";
    8.   }
    9.   $stmt = db2_prepare($this->conn, $this->sql);
    10.   db2_execute($stmt, array());
    11.   echo "<table width=80% border=1 align=center><tr>";
    12.   echo "<div align=center ><strong>Здравствуйте $fname </strong></div><p>";
    13.   while (db2_fetch_row($stmt)) {
    14.   $i++;
    15.   $c = db2_result($stmt, 0);
    16.   $name = db2_result($stmt, 1);
    17.  
    18.   echo "<td>";  
    19.   echo "$c";
    20.   echo "</td><td>";
    21.   echo "$name";
    22.   echo "</td>";
    23.   echo "<tr>";
    24.     }
    25.   echo "</td></tr></table>";
    26.  }
    не знаю что за зверь (если возможно то поясните можно ли передать этим кодом параметр в форму на которую он делает переход) но очень интереный - его бы заставить работать с задержкой в 2 секунды была бы красота
    echo "<HTML><HEAD>
    <META HTTP-EQUIV='Refresh' CONTENT='0; URL=admin.php'>
    </HEAD><body>";
     
  2. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    PHP:
    1.  
    2. $this->sql = "SELECT PASS,CODE,NAME from P where LOGIN = '".$_POST['name']."'";
    3.  
    SQL инъекция, $_POST['name'] не обрабатываться никак
     
  3. versia

    versia Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    15
    Симпатии:
    0
    Alost - вы имеете ввиду что $_POST['name'] не виден в функции pass() ? проверил - все передается и видится
    проверил таким способом

    function pass() {
    .........
    $s = $_POST['name'];
    echo "$s";
    .............
    }

    код сырой без вкусностей - но он рабочий за исключением того что если юзер введет логин которого нет в базе - тогда
    запрос будет пуст и программа похоже просто остановиться где то в функции pass() ну и еще там есть нехорошие моменты.
    меня волнуют вопросы взлома кода - я проверок никаких не делал. как сложно его взломать ? Честно говоря
    начитавшись страшилок про взлом и соответственно ничего не поняв из примеров прошу вашей помощи.
     
  4. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
  5. versia

    versia Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    15
    Симпатии:
    0
    спасибо понял - очень полезный материал
     
  6. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Просто нельзя заносить данные в запрос, не зная, что там.
    Грамотный (или не очень) "хакер" может чуть больше, чем сильно нагадить сайту.
    Если у пользователя mysql (например) есть права на удаление БД, то можно грохнуть БД и тд и тп.
     
  7. versia

    versia Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    15
    Симпатии:
    0
    Спасибо - я уже думал об ограничении это пользователя в правах - но если не трудно дайте пример вставки которая
    делала условие запроса всегда верным типа where LOGIN = x or y=y - у меня не получается сделать так что бы запрос $this->sql = "SELECT PASS,CODE,NAME from P where LOGIN = '$_POST[name]'"; выполнялся,
    это при том что поле LOGIN имеет тип "CHARACTER(20)" в БД.
     
  8. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    просто пускай в запрос данные через mysql_real_escape_string()

    Код (Text):
    1. $this->sql = "SELECT PASS,CODE,NAME from P where LOGIN = '".mysql_real_escape_string($_POST['name'])."'";
     
  9. versia

    versia Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    15
    Симпатии:
    0
    это применимо к базе данных DB2 ?
    Функцию mysql_real_escape_string() можно использовать только после того, как установлено соединение с MySQL. В противном случае возникнет ошибка уровня E_WARNING, а функция возвратит FALSE. Если link_identifier не указан, используется последнее открытое соединение.
    У меня не используется MySql.

    Может проще ограничить длину строки? типа substr('$_POST[name]',0,5) - вернет первых 5 символов - какой вредоносный код можно уместить в 5 символов?
     
  10. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    это костыль, причем для себя самого. нужно экранировать спецсимволы для конкретной БД, функции для этого (или сами символы) смотреть нужно в документации (мое знакомство с db2 окончилось парой лабораторных на дельфи, потому помочь не могу :) )