Возможный дубликат:
Что делает mysql_real_escape_string (), что делает addlashes ()?
Я рассматривал статьи о том, как / почему функция addashes PHP уязвима для SQL-инъекции. Все, что я прочитал, говорит о проблемах с определенными типами кодировки mysql (default-character-set = GBK), или есть проблемы, если magic_quotes включены. Тем не менее, я не смог вырваться из функции addslashes () в этом сценарии и сделать что-то злонамеренное – например, войти в систему как администратор.
$user = addslashes($_POST['user']); $pass = sha1($_POST['pass']); $sql = "SELECT * FROM admins WHERE user = '".$user."' AND `pass` = '".$pass."'"; $nums = mysql_num_rows(mysql_query($sql)); if($nums==1){ $_SESSION['admin_user'] = $user; $_SESSION['admin_pass'] = $pass;
Это (незначительный) аудит безопасности для клиента, и я рекомендую использовать PDO, но мне нужно отобразить их текущую уязвимость.
Рекомендации:
Shiflett показывает полный рабочий эксплойт в своей записи в блоге. Код, показанный выше, похоже, не соответствует этому примеру, поскольку он не использует набор символов, который обнаруживает эту уязвимость. Тем не менее, отверстие определенно существует.
Даже если это будет безопасно в конкретном сценарии, практика использования addslashes()
по-прежнему опасна, и статья Шифлетта должна дать вам достаточно материала для спора, хотя обстоятельства, которые требует эксплоит, очень эзотеричны, и они не являются полностью тривиально воспроизводить.
Если ваш клиент не согласен с опасностью, не видя живого эксплойта в своей конкретной системе, то не стоит делать аудит безопасности.
Является ли добавление PHP уязвимым для SQL-инъекции?
Да. С условиями, указанными в статье, с которой вы связаны.
Мне нужно показать их текущую уязвимость.
Я сомневаюсь, что вы можете отобразить это, так как кажется, что кодировка клиента не является известным GBK.
Хотя, скорее всего, существуют другие возможные уязвимости, просто потому, что люди склонны злоупотреблять функцией экранирования, ошиваясь.
Но я могу заверить вас, что до тех пор, пока кодировка вашего клиента будет однобайтовой или UTF-8, и пока эта функция будет использоваться правильно (как и в коде, который вы опубликовали) – не было бы никакой инъекции.
В вашем конкретном случае не кажется, что выполнить SQL-инъекцию так же просто, но обычная попытка попробовать – это что-то вроде, если я ввожу нулевую переменную unicode? как \0
? Разве это сломает скрипт и вернет все? Скорее всего, нет.
Итак, вам не всегда нужны косые черты для выполнения SQL-инъекции. Некоторые SQL могут быть написаны так ужасно неправильно, вот пример
"SELECT * FROM admins WHERE id = $id"
Если $id
– это число, его вполне допустимый SQL, и вы выполняете addslashes
на $ id, (кто бы это сделал?). Но для этого конкретного случая все, что вам нужно для SQL-инъекции, равно 1 OR 1=1
что делает запрос похожим
"SELECT * FROM admins WHERE id = 1 OR 1=1"
Нет никакого способа, чтобы addslashes
или magic_quotes
могли защитить вас от такой глупости.
Чтобы вернуться к вопросу, почему кто-то в здравом уме когда-либо использовал GBK
над чем-то вроде UTF-8
или UTF-16
?
Я не уверен, почему вы хотели бы использовать addlashes над mysql_real_escape_string (), но это ваш выбор, я полагаю.
addslashes () делает именно то, что он говорит: строка цитирования с косой чертой
Example #1 An addslashes() example <?php $str = "Is your name O'reilly?"; // Outputs: Is your name O\'reilly? echo addslashes($str);
Но некоторые SQL-атаки могут выполняться без кавычек (некоторые инъекции оболочки и некоторые слепые инъекции SQL).
По этой причине я лично использовал mysql_real_escape_string () над addslashes () для обеспечения безопасности ваших данных в этом случае.
Также рассмотрите использование sprintf () для ваших запросов sql, поскольку это делает его несколько более безопасным:
$query = sprintf("SELECT `username`,`password` FROM admins WHERE user = '%s' AND `pass` = '%s'", $user, $pass);
Это делает его более безопасным, поскольку он не позволит использовать другие типы данных, чем те, которые вы указали.
% d = цифра% s = строка и т. д.
Надеюсь, это поможет.