Добрый день. Прошу оценки данного кода в плане безопасности. Как работают некоторые операторы кода мне до конца не ясно - но они работают и фиг с ними. Простейшая авторизация - состоящая из двух файлов - admin.php и обработчик handler.php + еще есть класс class_sql.class в котором и происходит основная обработка. Собственно цель была создать простую авторизацию пользователя и получение списка определенных значений для этого пользователя.Пользователи заводятся вручную в БД. итак admin.php.... PHP: <table width="55%" border="0" align="left"> <form action="handler.php" method=post> <tr><td height="47" align="right"><br> Имя: <input type=text name=name value='user' /><br> </tr><tr><td align="right"> Пароль: <input type=password name=password value='password'><p> <input type=submit value=Отправить> </tr> </form> </table> handler.php..... PHP: <?php require("../class_sql.class"); $my=new class_sql; if ($_POST['name'] == '' or $_POST['password'] == '') { echo "<div align=center ><strong>Вы не ввели логин или пароль !</strong></div>"; echo "<HTML><HEAD> <META HTTP-EQUIV='Refresh' CONTENT='0; URL=admin.php'> </HEAD><body>"; } $my->pass(); ?> и две функции из класса class_sql.class... PHP: function pass() { $this->connect(); $this->sql = "SELECT PASS,CODE,NAME from P where LOGIN = '".$_POST['name']."'"; $result = db2_exec($this->conn, $this->sql); if (!$result) { echo " Ошибка SQl "; exit();} $stmt = db2_prepare($this->conn, $this->sql); db2_execute($stmt, array()); while (db2_fetch_row($stmt)) { $password = rtrim(db2_result($stmt, 0)); $code = rtrim(db2_result($stmt, 1)); $fname = rtrim(db2_result($stmt, 2)); if ($password == rtrim($_POST['password'])) { $this->select($code,$fname); } else { echo "<div align=center ><strong>Авторизация не пройдена!</strong></div>"; echo "<HTML><HEAD> <META HTTP-EQUIV='Refresh' CONTENT='0; URL=admin.php'> </HEAD><body>"; } } } и PHP: function select($code,$fname) { $i=0; $this->connect(); $this->sql = "SELECT CODE,NAME from B where status=$code"; $result = db2_exec($this->conn, $this->sql); if (!$result) { echo "У вас нет ...... !"; } $stmt = db2_prepare($this->conn, $this->sql); db2_execute($stmt, array()); echo "<table width=80% border=1 align=center><tr>"; echo "<div align=center ><strong>Здравствуйте $fname </strong></div><p>"; while (db2_fetch_row($stmt)) { $i++; $c = db2_result($stmt, 0); $name = db2_result($stmt, 1); echo "<td>"; echo "$c"; echo "</td><td>"; echo "$name"; echo "</td>"; echo "<tr>"; } echo "</td></tr></table>"; } не знаю что за зверь (если возможно то поясните можно ли передать этим кодом параметр в форму на которую он делает переход) но очень интереный - его бы заставить работать с задержкой в 2 секунды была бы красота echo "<HTML><HEAD> <META HTTP-EQUIV='Refresh' CONTENT='0; URL=admin.php'> </HEAD><body>";
PHP: $this->sql = "SELECT PASS,CODE,NAME from P where LOGIN = '".$_POST['name']."'"; SQL инъекция, $_POST['name'] не обрабатываться никак
Alost - вы имеете ввиду что $_POST['name'] не виден в функции pass() ? проверил - все передается и видится проверил таким способом function pass() { ......... $s = $_POST['name']; echo "$s"; ............. } код сырой без вкусностей - но он рабочий за исключением того что если юзер введет логин которого нет в базе - тогда запрос будет пуст и программа похоже просто остановиться где то в функции pass() ну и еще там есть нехорошие моменты. меня волнуют вопросы взлома кода - я проверок никаких не делал. как сложно его взломать ? Честно говоря начитавшись страшилок про взлом и соответственно ничего не поняв из примеров прошу вашей помощи.
Просто нельзя заносить данные в запрос, не зная, что там. Грамотный (или не очень) "хакер" может чуть больше, чем сильно нагадить сайту. Если у пользователя mysql (например) есть права на удаление БД, то можно грохнуть БД и тд и тп.
Спасибо - я уже думал об ограничении это пользователя в правах - но если не трудно дайте пример вставки которая делала условие запроса всегда верным типа where LOGIN = x or y=y - у меня не получается сделать так что бы запрос $this->sql = "SELECT PASS,CODE,NAME from P where LOGIN = '$_POST[name]'"; выполнялся, это при том что поле LOGIN имеет тип "CHARACTER(20)" в БД.
просто пускай в запрос данные через mysql_real_escape_string() Код (Text): $this->sql = "SELECT PASS,CODE,NAME from P where LOGIN = '".mysql_real_escape_string($_POST['name'])."'";
это применимо к базе данных DB2 ? Функцию mysql_real_escape_string() можно использовать только после того, как установлено соединение с MySQL. В противном случае возникнет ошибка уровня E_WARNING, а функция возвратит FALSE. Если link_identifier не указан, используется последнее открытое соединение. У меня не используется MySql. Может проще ограничить длину строки? типа substr('$_POST[name]',0,5) - вернет первых 5 символов - какой вредоносный код можно уместить в 5 символов?
это костыль, причем для себя самого. нужно экранировать спецсимволы для конкретной БД, функции для этого (или сами символы) смотреть нужно в документации (мое знакомство с db2 окончилось парой лабораторных на дельфи, потому помочь не могу )