Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Безопасно ли? защита от sql-injection 
:(
    Опции темы
zluka
Дата 11.3.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 27.7.2006

Репутация: нет
Всего: 2



Вот простой вывод статьи из БД:
Код

if(!empty($_GET['id']))
{
    $id = intval($_GET['id']); //Приводим значение к целому числу

    $query_select = mysql_query("SELECT * FROM articles WHERE id=".mysql_real_escape_string($id)); //Экранируем все символы

    $f = mysql_fetch_array($query_select);
    
    //Вывод самой статьи
    echo "</br>";
    echo "<h3>".$f['Title']."</h3>";
    echo "<p>".$f['Text']."</p>";
}

Достаточна ли защита от SQL-инъекции?


--------------------
user posted image
PM MAIL   Вверх
pizzz
Дата 11.3.2009, 14:27 (ссылка)   | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 14.12.2008
Где: Омск

Репутация: 6
Всего: 8



Код

if(!empty($_GET['id']))
{


Так не надо. Надо:

Код

if(isset($_GET['id']))
{



--------------------
Спасибо много, жмем кнопку репутация.  Извините меня за орфографические ошибки, я стараюсь не ошибаться, а они все равно просачиваются гады.     
PM MAIL ICQ   Вверх
bars80080
Дата 11.3.2009, 14:29 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



после intval смысла в mysql_real_escape_string нет
PM MAIL WWW   Вверх
pizzz
Дата 11.3.2009, 14:32 (ссылка)   | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 14.12.2008
Где: Омск

Репутация: 6
Всего: 8



Код

$id = intval($_GET['id']); //Приводим значение к целому числу


ТО есть если ид строка. То получиться 1. Хотя запросили строку.....


Проше сделать так:

Код


if ( isset($_GET['id']) && $_GET['id'] >= 0)
{

    $query_select = mysql_query("SELECT * FROM articles WHERE id='$id'")); 
    if ( 0 != mysql_num_rows($query_select)) {

        $f = mysql_fetch_array($query_select);
    
        //Вывод самой статьи
        echo "</br>";
        echo "<h3>".$f['Title']."</h3>";
        echo "<p>".$f['Text']."</p>";
     }
}



Добавлено через 58 секунд
Голова болит... Заболел... Могу ошибаться.....
--------------------
Спасибо много, жмем кнопку репутация.  Извините меня за орфографические ошибки, я стараюсь не ошибаться, а они все равно просачиваются гады.     
PM MAIL ICQ   Вверх
NewDima
Дата 11.3.2009, 16:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



и в конце вернулись к той же инъекции...
если $_GET['id'] - строка не число, то выражение 
Код

$_GET['id'] >= 0

всегда вернет истину а потому в 
$_GET['id'] может быть и "1' UNION ..." или "1' OR 1=1"
поправьте, если ошибаюсь

Добавлено @ 16:44
я бы использовал is_int, заодно можно хоть узнать, че нам пытаются впихать в запрос и анализировать в логах потом

Это сообщение отредактировал(а) NewDima - 11.3.2009, 16:45
PM ICQ   Вверх
O_c0der
Дата 11.3.2009, 20:56 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.1.2008
Где: /root

Репутация: нет
Всего: нет



Код

if(isset($_GET['id']) && !empty($_GET['id'])) { // Проверяем на наличие и пустоту переменную $_GET['id']
    $id = (int) $_GET['id']; // Присваиваем переменной тип int
    $query_select = mysql_query("SELECT * FROM articles WHERE id=$id"); // Запрос
    $f = mysql_fetch_array($query_select); // Получаем массив данных
    echo "</br><h3>".$f['Title']."</h3><p>".$f['Text']."</p>"; // Выводим статью
}

100% защита от атаки sql-injection
PM MAIL WWW ICQ   Вверх
SneG0K
Дата 11.3.2009, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 7
Всего: 54



O_c0der, и что ты изменил? Барс все сказал... 
Если извращать по конкретному, то регулярками и на пустоту... Хотя вполне хватит и преобразования в INT...
Хотя!, на сколько мне известно что строка 1a, после преобразования к Integer, становится 1. Ну в принципе логично. НО, в параметре уже левая буква завелась, что уже значит о наличии неправильных данных и хотя в большинстве случаев мускуль вернет значение по ID, я считаю, что стоит проверять на всякое лишнее... Если программа функциклирует правильно, то левым данным в ссылке браться неоткуда... Хотя это мое мнение.
PM WWW Skype   Вверх
enof
Дата 11.3.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 837
Регистрация: 23.1.2009
Где: Санкт-Петербург

Репутация: 30
Всего: 35



SneG0K, левые данные обычно берутся не из-за неправильного функционирования системы.
Цитата(SneG0K @  11.3.2009,  21:21 Найти цитируемый пост)
Если программа функциклирует правильно, то левым данным в ссылке браться неоткуда...

и теперь не обрабатывать данные от пользователя?

развернули тут, хотя все говорят об одном и том же почти smile 
mysql_escape_string or intval и ниче не страшно

Это сообщение отредактировал(а) enof - 11.3.2009, 21:29
PM MAIL ICQ Skype   Вверх
zluka
Дата 11.3.2009, 21:29 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 27.7.2006

Репутация: нет
Всего: 2



Спасибо, где целочисельный параметр я уже разобрался, а от как быть если параметр строковый:
Код

programs.php?type=windows

Использовать только mysql_real_escape_string?

Это сообщение отредактировал(а) zluka - 11.3.2009, 21:30


--------------------
user posted image
PM MAIL   Вверх
bars80080
Дата 11.3.2009, 21:48 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(zluka @  11.3.2009,  20:29 Найти цитируемый пост)
Использовать только mysql_real_escape_string?

угу
PM MAIL WWW   Вверх
pizzz
Дата 12.3.2009, 05:33 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 14.12.2008
Где: Омск

Репутация: 6
Всего: 8



Я бы его еще проверял strlen smile 
--------------------
Спасибо много, жмем кнопку репутация.  Извините меня за орфографические ошибки, я стараюсь не ошибаться, а они все равно просачиваются гады.     
PM MAIL ICQ   Вверх
pompei
Дата 12.3.2009, 06:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



А я всегда по тупому поступаю: любые аргументы прогоняю через mysql_real_escape_string (даже целые) - 100% гарантия от sql-injection.

А чтобы не париться со всякими-там конкатенациями и не писать часто длиннющую функцию mysql_real_escape_string - я написал класс, и всегда в базу хожу так:
Код

...
$connection = getConnection();
$connection->set_sql("select * from articles where id = :id");
$connection->set_param( "id", $_GET['id'] );
$rows = $connection->execute();
...

set_param($substring, $value) - в sql-строке все подстроки (":".$substring) заменяет на mysql_real_escape_string($value)
а mysql сам преобразует строку в число если колонка целочисленная



Это сообщение отредактировал(а) pompei - 12.3.2009, 06:24
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
xoma
Дата 12.3.2009, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2007

Репутация: нет
Всего: нет



а можно для работы  с БД просто воспользоваться PDO
PM MAIL WWW   Вверх
gta4kv
Дата 12.3.2009, 09:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



pizzz, спасибо поржал.

Цитата

Код

if(!empty($_GET['id']))
{


Так не надо. Надо:

Код

if(isset($_GET['id']))
{


isset при пустом id возвращает true, отличный совет вы дали.

Было бы правильнее:
Код

if( $id )
{
     // ...
}

Это универсальный способ, при отсутствие id — false, при пустом — false.

Цитата

ТО есть если ид строка. То получиться 1.

Вообще то будет 0.

И я предполагаю что в коде будет проверка на не существование записи, так что если юзер полезет корявыми руками то все равно ничего не выйдет.


zluka
прежде чем выводить проверяйте нашлось ли что нибудь:
Код

if( mysql_num_rows( $query ) > 0 )
{
    // ...
}


Цитата

Я бы его еще проверял strlen smile

зачем?

Цитата

Если извращать по конкретному, то регулярками и на пустоту...

Это только параноикам smile intval все равно сделает свою работу, и если переменная будет не числом в итоге будет 0, этого вроде вполне достаточно smile


Так же прошу заметить что такая конструкция:
Код

if( $id )
{
     // ...
}

не пропустила бы id = 0, ибо 0 === false

Это сообщение отредактировал(а) gta4kv - 12.3.2009, 09:38
PM MAIL   Вверх
pompei
Дата 16.3.2009, 14:33 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



Цитата(xoma @ 12.3.2009,  09:15)
а можно для работы  с БД просто воспользоваться PDO

абсолютно согласен
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1061 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.