Безопасность - SQL - PullRequest
       24

Безопасность - SQL

0 голосов
/ 16 февраля 2009

Эй, ниже страница, которая обрабатывает скрипт входа в систему, и мне интересно, если я поставил какие-либо дыры в безопасности Я читал статьи о защите от инъекций и прочее и хотел убедиться, что мой код защищен.

Он отправляется через ajax и возвращает JSON на основании правильного имени входа или нет.

<?php
ob_start();
session_start();
include ("config.inc.php");
include ("jsonEncode.php");

// ausername and apassword sent from form
$ausername = '';
$apassword = '';
$ausername = mysql_real_escape_string(stripslashes($_GET['username']));
$apassword = mysql_real_escape_string(stripslashes($_GET['password']));

$sql    = "SELECT * FROM admin WHERE ausername='$ausername' AND apassword='$apassword' LIMIT 1";
$result = mysql_query($sql) or die(mysql_error());

$data   = mysql_fetch_array($result);
$count  = mysql_num_rows($result);

if($count==1){
    $_SESSION['ausername'] = $ausername;
    $_SESSION['apassword'] = $apassword;
    $_SESSION['admin_id']  = $data['a_id'];
    $a_id = $data['a_id'];
    $_SESSION['LastLogin'] = $data['last_login'];
    $query = "UPDATE admin SET last_login = Now() WHERE `a_id`= $a_id";
    mysql_query($query);
    //echo $query;
    $_SESSION['aloggedin'] = "1234";
    // valid
    $var = array('avalid' => 1, 'ausername' => $ausername, 'apassword' => $apassword);
    print php_json_encode($var);
}else{
    // invalid
    $var = array('avalid' => 0, 'ausername' => $ausername, 'apassword' => $apassword);
    print php_json_encode($var);
}
?>

Ответы [ 6 ]

5 голосов
/ 16 февраля 2009

Возможно, вы захотите использовать метод POST, а не GET с формой входа в систему, в противном случае их пароль будет отображаться в URL-адресе, а URL-адреса не очень безопасны (они могут быть добавлены в закладки или отправлены на другой сервер в качестве URL-адреса перехода, для пример).

2 голосов
/ 16 февраля 2009

Вам не нужно снимать косые черты. Если вы также не удаляете косые черты при заполнении этих столбцов, вы фактически создали дыру в безопасности - если по какой-либо причине у вас нет уникального ограничения на поле имени пользователя, и / или у вас есть косые черты в сохраненных поля имени пользователя или пароля и их пароли отличались только косой чертой, вы можете зарегистрировать одного пользователя как другого.

1 голос
/ 16 февраля 2009

Вы должны использовать связанные параметры для ввода пользовательских данных в SQL, а не для конкатенации строк.

Кроме того, вы, вероятно, должны хранить хэши паролей в вашей базе данных, а не оригинальные пароли в виде открытого текста.

Наконец, не проблема безопасности, но установка $ ausername и $ apassword в значение '' непосредственно перед присвоением им новых значений совершенно бессмысленна.

0 голосов
/ 16 февраля 2009

Все хорошие ответы выше.

Единственное, что я хочу добавить, но это не упомянуто ... Я стремлюсь получить пароль учетной записи и выполнить сравнение PHP, а не вводить пароль в запрос и искать, существует ли строка.

0 голосов
/ 16 февраля 2009

(я - специалист по MSSQL, поэтому не знаю, относятся ли какие-либо из этих пунктов к MySQL)

Это на самом деле не связано с безопасностью, просто общие замечания на случай, если это будет полезно:

Не используйте SELECT * - выведите список нужных вам столбцов - похоже, вам нужен только a_id & last_login. Вы можете добавить Blob в эту таблицу с их фотографией в будущем или с личными заметками и т. Д. - это убьет производительность во всех местах, где вы использовали SELECT * в прошлом, и вам не нужна картинка.

Я бы не стал использовать LIMIT 1 - я бы очень хотел узнать, есть ли в данный момент DUP, и вызвать ошибку.

Я бы поместил столбец last_login в другую таблицу, связанную 1: 1 с вашей таблицей User / password. Это элемент частых изменений, и если вы решите ввести таблицу Audit в таблицу user / Password (т. Е. Сохранять старые значения всякий раз, когда она изменяется), имея часто меняющийся столбец «info», это немного портит.

Лично я хотел бы, чтобы соглашение об именах столбцов и переменная SESSION / одно и то же.

admin_id / a_id, LastLogin / last_login

Лично я не буду хранить пароль в сеансе, если он вам не понадобится позже. Я бы сохранил что-то, чтобы указать «разрешения», которые есть у пользователя, и затем использовал бы это, чтобы решить, могут ли они просматривать PageX или PageY и т. Д.

0 голосов
/ 16 февраля 2009

Кроме того, не храните пароль в сеансе. По умолчанию данные сеанса Php хранятся в каталоге OS tmp / temp, чтобы их могли просматривать другие пользователи. Обычно я просто сохраняю имя пользователя в сеансе и запрашиваю базу данных при необходимости. Это позволяет избежать проблем при изменении информации пользователя, но сеанс не обновляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...