Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: проблема с mail()
 
 автор: qsef   (07.07.2009 в 11:58)   письмо автору
 
 

Добрый день.
На сколько безопасен такой запрос:

$_GET[name] = 'name'
mysql_query("SELECT id FROM table WHERE md5(name) = md5($_GET[name])");

Возможна ли здесь sql-inj или XSS?

  Ответить  
 
 автор: Trianon   (07.07.2009 в 12:01)   письмо автору
 
   для: qsef   (07.07.2009 в 11:58)
 

абсолютно безопасен. Благо изначально ошибочен.

  Ответить  
 
 автор: qsef   (07.07.2009 в 12:03)   письмо автору
 
   для: Trianon   (07.07.2009 в 12:01)
 

Ошибочен в чем?

  Ответить  
 
 автор: Valick   (07.07.2009 в 12:11)   письмо автору
 
   для: qsef   (07.07.2009 в 12:03)
 

1) чтобы исключить инъекции данные от клиента нужно грамотно обрабатывать (зависит от данных).
2) в поле name нужно уже хранить хеш, в противном случае вся эта лабуда с md5 бессмысленна.
3) в запрос нужно подставлять уже обработанные переменные, как я и написал $_GET там быть не должно.

  Ответить  
 
 автор: Trianon   (07.07.2009 в 12:13)   письмо автору
 
   для: qsef   (07.07.2009 в 12:03)
 

Чтобы понять, в чем запрос ошибочен, его нужно напечатать, и посмотреть на него, а не выполнять тут же.

  Ответить  
 
 автор: Valick   (07.07.2009 в 12:05)   письмо автору
 
   для: qsef   (07.07.2009 в 11:58)
 

$_GET[name] = 'name' - это не имеет смысла...
WHERE md5(name) - это тоже не имеет смысла...
md5($_GET[name]) - это потенциальная дыра и в запросе этого $_GET[name] быть не должно
___
кстати причём тут mail()?

  Ответить  
 
 автор: qsef   (07.07.2009 в 12:11)   письмо автору
 
   для: Valick   (07.07.2009 в 12:05)
 

Спасибо за ответ. Просто я подумал, что функция md5() сравнивает хеши и если хоть один символ отличается, то они не совпадут, а значит запрос не пройдет.

  Ответить  
 
 автор: Trianon   (07.07.2009 в 12:15)   письмо автору
 
   для: qsef   (07.07.2009 в 12:11)
 

функция md5 ничего не сравниавает. Она вычисляет хеш своего аргумента.
Но чем писать так, как у Вас, почему не написать прямое сравнение поля с входным параметром скрипта?
Чего Вы добились этим md5?

  Ответить  
 
 автор: Valick   (07.07.2009 в 12:18)   письмо автору
 
   для: qsef   (07.07.2009 в 12:11)
 

функция md5() сравнивает хеши
это попытка защититься от подделки имени (замена латиницы кириллицей) или что?

  Ответить  
 
 автор: qsef   (07.07.2009 в 12:20)   письмо автору
 
   для: Valick   (07.07.2009 в 12:18)
 

я имею ввиду так: ...WHERE md5(name) = md5($name)

  Ответить  
 
 автор: Valick   (07.07.2009 в 12:45)   письмо автору
 
   для: qsef   (07.07.2009 в 12:20)
 

а чем это отличается от этого?
WHERE name = '$name'

  Ответить  
 
 автор: qsef   (07.07.2009 в 12:54)   письмо автору
 
   для: Valick   (07.07.2009 в 12:45)
 

Если в $name будет зловредный код, то md5() преобразует его в хеш.
В запросе сравниваются два хеша: ...WHERE md5(name) = md5($name)
если они не совпадают, то и не выполняются. Вот я и спрашиваю, возможна ли здесь атака?

  Ответить  
 
 автор: Trianon   (07.07.2009 в 13:41)   письмо автору
 
   для: qsef   (07.07.2009 в 12:54)
 

если в $name кавычки уже экранированы - никакого зловредного кода не будет.
Если не экранированы - md5 от зловредного кода никак не спасет.
Пример (для исправленных синтаксических ошибок) :
$name = "') OR (''='";


Судя по тому, что Вы до сих пор ошибку не исправили, весь этот диспут - корм совершенно не в коня.
Пример для Вашего случая :
$name = "'0') OR (1";


Формально допуская, однако, что автор кода куда хитрее, чем кажется...
нет. Тогда бы он не стал применять md5 с обеих сторон от знака равенства
.

  Ответить  
 
 автор: qsef   (07.07.2009 в 17:42)   письмо автору
 
   для: Trianon   (07.07.2009 в 13:41)
 

>Если не экранированы - md5 от зловредного кода никак не спасет.
Вот это я и хотел узнать.
Просто у меня есть запрос:

"SELECT id FROM tbl WHERE name = '$name'";

$name - это строка из GET-запроса:

http://sait.com/$name/


Большое спасибо.

  Ответить  
 
 автор: Trianon   (07.07.2009 в 18:08)   письмо автору
 
   для: qsef   (07.07.2009 в 17:42)
 

>Просто у меня есть запрос:
>"SELECT id FROM tbl WHERE name = '$name'";
Это не запрос. Это целое выражение вида
"SELECT id FROM tbl WHERE name = '" . $name . "'"

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

Даже если
>$name - это строка из GET-запроса:
>
http://sait.com/$name/


А если нет?

  Ответить  
 
 автор: qsef   (07.07.2009 в 20:37)   письмо автору
 
   для: Trianon   (07.07.2009 в 18:08)
 

Вообще идея была такая, в выражении сравниваются два хеша, если символы внутри функции md5() разные, то и хеши будут разные и как результат не совпадут.

"SELECT * FROM tbl WHERE md5(alias) = '".md5($name)."'";

  Ответить  
 
 автор: Trianon   (07.07.2009 в 20:47)   письмо автору
 
   для: qsef   (07.07.2009 в 20:37)
 

этот код принципиально другой. Его даже можно применить без особой опаски.

Хотя опять же неясно, зачем сравнивать хеши, если можно сравнить сами имена.

  Ответить  
 
 автор: qsef   (07.07.2009 в 20:55)   письмо автору
 
   для: Trianon   (07.07.2009 в 20:47)
 

Почему хеши? В переменной $name может быть зловредный код и если сравнить его напрямую, то код исполнится(имеется ввиду, что $name необработанная переменная).
А md5() преобразует код в хеш.

  Ответить  
 
 автор: Trianon   (07.07.2009 в 21:42)   письмо автору
 
   для: qsef   (07.07.2009 в 20:55)
 

>Почему хеши? В переменной $name может быть зловредный код и если сравнить его напрямую, то код исполнится(имеется ввиду, что $name необработанная переменная).

Так обработайте её перед укладыванием в запрос! Зачем же извращаться-то?
На вычисление хеша будет положено на 4 порядка больше ресурсов, чем на экранирование кавычек!

>А md5() преобразует код в хеш.

И?

  Ответить  
 
 автор: qsef   (07.07.2009 в 22:14)   письмо автору
 
   для: Trianon   (07.07.2009 в 21:42)
 

>На вычисление хеша будет положено на 4 порядка больше ресурсов, чем на экранирование кавычек!
Ага, понял. Просто возникла такая идея и я спросил.
>И?
И будут сравниваться хеши, а не код, т. е. sql injection будет невозможна.

  Ответить  
 
 автор: Valick   (07.07.2009 в 22:49)   письмо автору
 
   для: qsef   (07.07.2009 в 22:14)
 

И будут сравниваться хеши, а не код, т. е. sql injection будет невозможна.
Это далеко не так, не путайте sql запрос с выводом в браузер
Инъекция будет возможна в любом случае при неграмотной обработке входящих данных, не думайте что изобрели "кремлёвскую таблетку".
Пример инъекции Вам привёл Trianon, Вы судя по всему пропустили это мимо ушей, раз до сих пор думаете защититься от зловредов при помощи md5

  Ответить  
 
 автор: qsef   (07.07.2009 в 12:23)   письмо автору
 
   для: Valick   (07.07.2009 в 12:05)
 

за mail() извиняюсь, так вышло...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования