Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/137: Рейтинг темы: голосов - 137, средняя оценка - 4.78
4 / 4 / 0
Регистрация: 11.10.2008
Сообщений: 47

Защита от SQL инъекций

25.04.2009, 00:02. Показов 27539. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тема избитая. По ней куча статей, но информация зачастую противоречивая.

Во-первых, вопрос - является ли слэширование (' -> \', " -> \") переменных, участвующих в SQL запросах, 100% защитой? Если нет - приведите, пожалуйста, пример такой инъекции.

И второй вопрос - на сколько функция mysql_real_escape_string(); справляется с задачей безопасности, хватает ли этой функции?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.04.2009, 00:02
Ответы с готовыми решениями:

Защита от SQL-инъекций
Много читал, но все равно интересно. Сейчас переписывать весь проект под PDO будет очень тяжело. Весь код на MySQLi. Сподвигло меня...

Защита от SQL инъекций
Здравствуйте! Прошерстив 2 дня интернет так и не нашел ответ на свой вопрос. Например если я знаю какие мне данные отправит...

Не работает защита от sql инъекций
Здравствуйте!. Есть следующий код. Решил сделать защиту от sql инъекций , но почему-то не работает execute(). За помощь очень благодарен ...

18
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
25.04.2009, 08:15
Ещё когда числа используешь, то их вначале надо приводить к типу integer.. а то вдруг, это будет не число, а часть SQL запроса.
PHP
1
2
3
$id = $_POST['id'];
settype($id,'integer');
$sql = "SELECT * FROM tab1 WHERE id=$id;";
Это гарантирует, что в $id не будет никакой инъекции. Либо ещё можно писать в кавычках WHERE id='$id' но тогда в $id надо будет ещё и экранировать кавычки.
Лично я для экранирования использую функцию addslashes.
0
4 / 4 / 0
Регистрация: 11.10.2008
Сообщений: 47
25.04.2009, 11:43  [ТС]
Humanoid, спасибо за ответ. Т.е. экранирование кавычек является достаточной защитой против SQL-инъекций? А почему вы используете именно addslashes(), а не mysql_real_escape_string()?
0
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
25.04.2009, 17:23
Не знаю... просто так повелось. Честно говоря, я даже не понял в чём у них разница. Думаю, важно заметить, что я пишу страницы, которые в инете не видны... и попыток атак не было. Поэтому мои знания о надёжности только теоретические.
0
 Аватар для NEOSYS
26 / 20 / 5
Регистрация: 28.04.2009
Сообщений: 75
02.05.2009, 22:25
гарантированная защита от иньекций всех типов :

PHP
1
2
3
4
5
6
7
8
9
10
11
$text_to_check = mysql_real_escape_string ($_GET["запрос"]);
 
    $text_to_check = strip_tags($text_to_check);
         
    $text_to_check = htmlspecialchars($text_to_check);
 
    $text_to_check = stripslashes($text_to_check);
     
    $text_to_check = addslashes($text_to_check);   
 
    $_GET["запрос"] = $text_to_check;
0
 Аватар для Ceran
172 / 101 / 10
Регистрация: 22.02.2009
Сообщений: 440
03.05.2009, 00:56
А не проще ли и эффективнее использовать регулярные выражения? При этом можно обеспечить (и гарантировать) попадание в SQL-запрос ТОЛЬКО того, что нужно и ничего более... Хотя, это просто размышления на заданную тему...
0
aristokrat74
18.01.2010, 05:45
глупость. все что насоветовали та еще.
mysqli_real_escape_string

(PHP 5)

mysqli::real_escape_string -- mysqli_real_escape_string — Escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection
Report a bug
Description

Object oriented style (both methods are equivalent):
string mysqli::escape_string ( string $escapestr )
string mysqli::real_escape_string ( string $escapestr )

Procedural style:
string mysqli_real_escape_string ( mysqli $link , string $escapestr )

This function is used to create a legal SQL string that you can use in an SQL statement. The given string is encoded to an escaped SQL string, taking into account the current character set of the connection.
http://ru2.php.net/manual/en/m... string.php

а теперь включаем мозг и понимаем что разработчики за вас все сделали и остается лишь проверить
PHP
1
var_dump(get_magic_quotes_gpc());
и если получили int(1) то забить на эту тему, если нет то функции применять имеет смысл.

NEOSYS, зачем так систему напрягать-то?? - вообще действия безсмысленные.
SiTH, разница вот в чем: escape_string: The string to be escaped. Characters encoded are NUL (ASCII 0), \n, \r, \, ', ", and Control-Z.
, а addslashes These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).
Robert29
11.08.2011, 19:35
Во врем авторизации я предлагаю не использовать переменные в sql запросах. Во время поверки введённых данных нужно считывать все строки в таблице и в цикле проверять совпадения.
Вот пример кода
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$sql_select=mysql_query("SELECT * FROM users order by id_users",$db);
              $arr=mysql_fetch_array($sql_select); 
              do{
                if($arr['login']==$login&&$arr['password']==$password){
                    $_SESSION['id_users']=$arr['id_users'];
                    print "<HTML><HEAD>\n";
                    print "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=admin.php'>\n";
                    print "</HEAD></HTML>\n";
                    exit();  
                }
              }
              while($arr=mysql_fetch_array($sql_select));
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
11.08.2011, 19:41
Цитата Сообщение от Robert29 Посмотреть сообщение
Во время поверки введённых данных нужно считывать все строки в таблице и в цикле проверять совпадения.
А если в таблице сотни тысяч пользователей? Это будет создавать огромную нагрузку на сервер.
0
Robert29
11.08.2011, 20:02
Цитата Сообщение от Humanoid Посмотреть сообщение
А если в таблице сотни тысяч пользователей? Это будет создавать огромную нагрузку на сервер.
Забыл уточнить, мой способ актуален только для админки

Добавлено через 1 минуту
и всё таки идея стоит внимания
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
11.08.2011, 22:17
Всё же, я не соглашусь. Такой способ подойдёт для данных, которые хранятся в текстовом файле... их придётся по одному доставать и анализировать. А тут MySQL предоставляет огромные возможности по поиску и их лучше использовать. Все эти циклы PHP всё равно будут выполняться гораздо медленнее, чем внутренний поиск MySQL. Да и код получится гораздо компактнее.
Кстати, конструкция
PHP
1
2
3
4
$arr=mysql_fetch_array($sql_select);
do{
.......
} while($arr=mysql_fetch_array($sql_select));
Почти полностью эквивалентна конструкции
PHP
1
2
3
4
while($arr=mysql_fetch_array($sql_select))
{
......
}
К тому же, в первом случае есть ошибка... если ни одной строки не будет найдено, то цикл всё равно пройдёт один раз... а этого делать нельзя, потому что массив $arr в этом случае будет пустой. А во втором коде такой проблемы нет... если ничего не найдено, то в цикл мы вообще не попадём.
0
1 / 1 / 0
Регистрация: 17.01.2012
Сообщений: 5
03.04.2012, 10:08
Здравтвуйте, хороший толковый материал. Многое подчерпнул для себя. Так же всем интересующимся данной темой рекомендуй почитать, изложенный мной метод защиты от SQL инъекций:

http://lifeexample.ru/php-prim... ktsiy.html
0
 Аватар для SergeyS
154 / 146 / 20
Регистрация: 12.03.2011
Сообщений: 806
03.04.2012, 11:22
Цитата Сообщение от Humanoid Посмотреть сообщение
К тому же, в первом случае есть ошибка... если ни одной строки не будет найдено, то цикл всё равно пройдёт один раз...

Не по теме:

Следствие учений Попова :)

0
 Аватар для Денис Н.
463 / 463 / 23
Регистрация: 17.08.2011
Сообщений: 1,488
04.04.2012, 05:33
Цитата Сообщение от Robert29 Посмотреть сообщение
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$sql_select=mysql_query("SELECT * FROM users order by id_users",$db);
 $arr=mysql_fetch_array($sql_select); 
 do{
 if($arr['login']==$login&&$arr['password']==$password){
 $_SESSION['id_users']=$arr['id_users'];
 print "<HTML><HEAD>\n";
 print "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=admin.php'>\n";
 print "</HEAD></HTML>\n";
 exit(); 
 }
 }
 while($arr=mysql_fetch_array($sql_select))
То есть мы сначала выбираем всю таблицу юзеров, то есть вообще всю...и то, что не надо тоже.
Потом вгоняем это в цикл, и там все это лопатим...
Да и с какой целью были созданы копии двух одинаковых массивов в памяти? А если там over 9000?.. да со всем барахлом...

Не целесообразнее ли использовать запрос с WHERE чтобы отсеять over 9000 пользователей? А затем использовать mysql_fetch_row?
Вот так:
PHP
1
2
3
4
5
6
7
$sql_select=mysql_query("SELECT id_users FROM users WHERE login='$login' AND pass='$pass'",$db);
$arr=mysql_fetch_row($sql_select); 
if($arr)
{
    $_SESSION['id_users']=$arr[0];
    header('Location: admin.php');
}
Похоже, ваша идея разнесена в пух и прах
0
239 / 236 / 43
Регистрация: 16.03.2011
Сообщений: 750
04.04.2012, 07:54
Про защиту
http://ru2.php.net/manual/ru/s... ection.php
0
8 / 9 / 1
Регистрация: 21.12.2011
Сообщений: 401
18.01.2013, 01:44
Цитата Сообщение от NEOSYS Посмотреть сообщение
гарантированная защита от иньекций всех типов :

PHP
1
2
3
4
5
6
7
8
9
10
11
$text_to_check = mysql_real_escape_string ($_GET["запрос"]);
 
    $text_to_check = strip_tags($text_to_check);
         
    $text_to_check = htmlspecialchars($text_to_check);
 
    $text_to_check = stripslashes($text_to_check);
     
    $text_to_check = addslashes($text_to_check);   
 
    $_GET["запрос"] = $text_to_check;
куда именно нужно вводить этот код ?
0
 Аватар для alpex
603 / 578 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
18.01.2013, 01:50
Цитата Сообщение от gigs Посмотреть сообщение
куда именно нужно вводить этот код ?
это бредовая защита

ставим слеши mysql_real_escape_string потоом убираем слеши stripslashes а потом опять ставим слеши addslashes и в конце еще и перезаписываем суперглобальный массив $_GET["запрос"]
0
 Аватар для Totoro
47 / 23 / 3
Регистрация: 28.05.2012
Сообщений: 150
Записей в блоге: 1
18.01.2013, 07:38
Не вижу смысла рассуждать о проблеме защиты от SQL в контексте функций библиотеки mySQL учитывая что с PHP 5.5.0 она будет помечена как deprecated и ближе к 6 версии будет и вовсе удалена.

Идеи типа addslashes и mysql_real_escape_string лично я считаю признаком не профессионализма.

Сам лично считаю минимальной защитой использование placeholder's в PDO или mySQLi.

P.S Представляю визг быдлокодеров когда mySQL и её быдло плюшки работать перестанут.

P. P. S Против библы mySQL ничего против не имею библа хорошая НО для своего времени(лет этак 10 назад) но её место вместе с PHP 4 в прошлом.
0
18.01.2013, 16:35

Не по теме:

Цитата Сообщение от gigs Посмотреть сообщение
Цитата Сообщение от NEOSYS Посмотреть сообщение
гарантированная защита от иньекций всех типов :
PHP
1
2
3
4
5
6
$text_to_check = mysql_real_escape_string ($_GET["запрос"]);
$text_to_check = strip_tags($text_to_check);
$text_to_check = htmlspecialchars($text_to_check);
$text_to_check = stripslashes($text_to_check);
$text_to_check = addslashes($text_to_check);   
$_GET["запрос"] = $text_to_check;
куда именно нужно вводить этот код ?
Это код напоминает анекдот:
На приёме у врача:
— Дышите. Не дышите. Дышите. Не дышите. Не дышите. Не дышите. Выносите. Следующий.

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.01.2013, 16:35
Помогаю со студенческими работами здесь

Защита от инъекций
Привет, как можно защититься от ввода в форму пароля php тегов, типа select, echo, insert и других.

Защита от инъекций
Подскажите какие символы остаются не экранированными и угрожают безопасности, если включена директива magic_quotes? Добавлено через 10...

Защита от sql инъекций одним файлом
Привет всем. Помогите дописать или поделитесь уже готовым файлом. Ситуация следующая. На веб сервере много разных проектов, мини игры,...

Защита от инъекций strip_tags
Всем привет. У меня была задача написать php файл, который принимал бы значения формы регистрации, сохранял их в файле на сервере....

сканер на наличие sql инъекций
Приветствую Получаю все ссылки с сайта с помощью регулярного выражения и привожу их в единый вид, заношу получившиеся ссылки в массив....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru