[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: mysql_real_escape_string -панацея от sql-injection
waldicom
Выписка из чата, читать снизу вверх:
Цитата

#12762 Отправитель: Rivalryzerg
25.08.2010 - 16:38
запрос должен выглядеть: " .. WHERE `id`=" . quote($d); в функция quote: return "'" . mysql_real_escape_string($value) . "'";

#12761 Отправитель: Rivalryzerg
25.08.2010 - 16:37
если так писать запросы - то горе тому программисту )

#12760 Отправитель: waldicom
25.08.2010 - 16:29
select * from tbl where id = $d; $d = "1 union select 1,2 from tbl1 /*" - такое mysql_*escape_string не отловит

#12759 Отправитель: Rivalryzerg
25.08.2010 - 16:19
Типа найти символ в какой-либо таблице символов, который воспринимается mysql как ковычка, но пропускается функцией escape. По-моему из разряда фантастики

#12758 Отправитель: Rivalryzerg
25.08.2010 - 16:17
Я читал, что в теории можно. Но лично я не верю в это)

#12757 Отправитель: waldicom
25.08.2010 - 16:04
можно сделать sql-injection даже если используется mysql_*escape_string - так будет правельнее звучать

#12756 Отправитель: Basili4
25.08.2010 - 16:02
ну это слишком ....

#12755 Отправитель: twin
25.08.2010 - 16:00
кувалдой

#12754 Отправитель: Basili4
25.08.2010 - 15:55
как ????

#12753 Отправитель: twin
25.08.2010 - 15:53
можно

#12752 Отправитель: Basili4
25.08.2010 - 15:39
судя по тому что знаю и что начитал скажу что не обходится

#12751 Отправитель: Basili4
25.08.2010 - 15:39
не тут просто один чел заявил что знает как обойти я вот думаю троль или нет ?

#12750 Отправитель: IamSmorodin
25.08.2010 - 15:36
хакерством решил заняться?smile.gif

#12749 Отправитель: Basili4
25.08.2010 - 15:35
и mysql_real_escape_string ?

#12748 Отправитель: Basili4
25.08.2010 - 15:34
Вопрос у меня возник можно как нибудь обойти mysql_escape_string





Спустя 2 минуты, 13 секунд (25.08.2010 - 17:02) waldicom написал(а):
Цитата
запрос должен выглядеть: " .. WHERE `id`=" . quote($d); в функция quote: return "'" . mysql_real_escape_string($value) . "'";

Не, для таких вещей просто надо вставить (int)$d

Спустя 13 минут, 29 секунд (25.08.2010 - 17:15) Rivalryzerg написал(а):
Вы демонстрируете частный случай, когда заведомо известно что поле именно целое. Для остальных типов полей уже без mysql_real_escape_string не обойтись.

Вообще, используя различного рода фреймворки или просто полезные классы для работы с БД, программист вообще не пишет запросов. Он оперирует методами типа

$users->findById($value);


и ему совершенно уже не важно что пришло в $value. Используемый инструмент уже сам все как нужно экранирует.

Но по сути темы - вы поняли почему обойти mysql_real_escape_string я считаю невозможно на данный момент?

Спустя 22 минуты, 34 секунды (25.08.2010 - 17:38) waldicom написал(а):
Цитата (Rivalryzerg @ 25.08.2010 - 17:15)
вы поняли почему обойти mysql_real_escape_string я считаю невозможно на данный момент

мы говорим о разных вещах: для меня "нельзя обойти", это когда раьботает такая конструкция:


$query = "select * from tbl where id = " . mysql_real_escape_string($_GET['id']);
страница вызывается так: blabla?id=1%20UNION%20SELECT%201,2%20from%20tbl1%20/*%20

То, что вы пишите обертку для функции mysql_real_escape_string как раз говорит о том, что её можно обойти.
Или как?

Спустя 7 минут, 53 секунды (25.08.2010 - 17:46) Rivalryzerg написал(а):
Действительно говорим о разных вещах. Функция mysql_real_escape_string экранирует символы в строке, чтобы ее можно было использовать в выражении mysql. Функция делает ровно то, что должна.

Однако составляю выражение mysql мы же должны следовать четким правилам. Например указать четкие границы значения параметра запроса. Для этого используются кавычки.

Но обойти функцию mysql_real_escape_string, чтобы как раз выйти за эти кавычки и изменить mysql выражение - нельзя.

Спустя 12 минут, 22 секунды (25.08.2010 - 17:58) waldicom написал(а):
Ну нельзя так нельзя...

Спустя 9 месяцев, 26 дней, 17 часов, 55 минут, 28 секунд (22.06.2011 - 11:54) linker написал(а):
Любая дыра в безопасности целиком и полностью на ответственности программиста. Здесь два выхода, либо:
... WHERE `id`=" . (int)$id;
либо
... WHERE `id`= '" . mysql_real_escape_string($d) . "'";
в последнем случае хакеру придётся использовать кавычку, которая будет успешно экранирована mysql_real_escape_string() и попытка инъекции не пройдёт. Кривой программер оставит дыру даже там, где нормальному покажется 100% защита.

Спустя 16 минут, 37 секунд (22.06.2011 - 12:10) waldicom написал(а):
фигасе тему откопал smile.gif

Спустя 16 минут, 44 секунды (22.06.2011 - 12:27) UScorp написал(а):
Цитата
#12762 Отправитель: Rivalryzerg
25.08.2010 - 16:38
запрос должен выглядеть: " .. WHERE `id`=" . quote($d); в функция quote: return "'" . mysql_real_escape_string($value) . "'";

#12761 Отправитель: Rivalryzerg
25.08.2010 - 16:37
если так писать запросы - то горе тому программисту )


А почему горе тому программисту, что он делает не так?

Спустя 22 минуты, 11 секунд (22.06.2011 - 12:49) linker написал(а):
waldicom
smile.gif Да блин появилась в списке новых сообщений, а оказалось, что это некий спамер запостился. smile.gif

Спустя 10 месяцев, 1 день, 9 часов, 17 минут, 21 секунда (23.04.2012 - 22:06) ДЕМОН написал(а):
Цитата (UScorp @ 22.06.2011 - 10:27)
А почему горе тому программисту, что он делает не так?

Это вы делаете не так. Вы читаете с верху вниз.

mysql_escape_string и mysql_real_escape_string можно обойти, если параметр в запросе не взят в ковычки (WHERE id=$id, вместо WHERE id='$id').

mysql_escape_string можно обойти даже когда параметр в ковычках, потому что эта функция не справляется с многобайтными кодировками. ковычку написанную в многобайтовой кодировке, она пропустит, приняв за 2 безопасных символа.

позже была придумана mysql_real_escape_string, которая является заменой функции mysql_escape_string и которая учитывает все нюансы.

Спустя 1 час, 16 минут, 37 секунд (23.04.2012 - 23:23) I++ написал(а):
Цитата
... WHERE `id`=" . (int)$id;


Это может привести к другим проблемам которые не были учтены при проектировке.

Данные нужно проверять отдельно а делать костыли (int)$id плохо...

Это такой же говеный тон как в С++ пробывать делить переменную на 0 такой же говнокод

htmlscpecialchars ? Давно пользуюсь и проблем не имею...

А еще можно использовать не только /* но и --

Спустя 9 минут, 31 секунда (23.04.2012 - 23:33) I++ написал(а):
Я бы сделал так:

<?php

if(!is_numeric($_GET['id']))
return;

$query = 'SELECT * FROM `tbl` WHERE `id` = ' .$_GET['id'];

?>


* - плохо

Можно так же делать проверку числа, могут ввести 10000000000500000000 но это ничего не даст.

Спустя 15 минут, 24 секунды (23.04.2012 - 23:48) inpost написал(а):
I++
А чем тебе (int) не нравится? Нормально работает.


_____________
Свои мозги еще никто не отменял.
Телепатов нету.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.