|
|
|
| Добрый день.
На сколько безопасен такой запрос:
$_GET[name] = 'name'
mysql_query("SELECT id FROM table WHERE md5(name) = md5($_GET[name])");
|
Возможна ли здесь sql-inj или XSS? | |
|
|
|
|
|
|
|
для: qsef
(07.07.2009 в 11:58)
| | абсолютно безопасен. Благо изначально ошибочен. | |
|
|
|
|
|
|
|
для: Trianon
(07.07.2009 в 12:01)
| | Ошибочен в чем? | |
|
|
|
|
|
|
|
для: qsef
(07.07.2009 в 12:03)
| | 1) чтобы исключить инъекции данные от клиента нужно грамотно обрабатывать (зависит от данных).
2) в поле name нужно уже хранить хеш, в противном случае вся эта лабуда с md5 бессмысленна.
3) в запрос нужно подставлять уже обработанные переменные, как я и написал $_GET там быть не должно. | |
|
|
|
|
|
|
|
для: qsef
(07.07.2009 в 12:03)
| | Чтобы понять, в чем запрос ошибочен, его нужно напечатать, и посмотреть на него, а не выполнять тут же. | |
|
|
|
|
|
|
|
для: qsef
(07.07.2009 в 11:58)
| | $_GET[name] = 'name' - это не имеет смысла...
WHERE md5(name) - это тоже не имеет смысла...
md5($_GET[name]) - это потенциальная дыра и в запросе этого $_GET[name] быть не должно
___
кстати причём тут mail()? | |
|
|
|
|
|
|
|
для: Valick
(07.07.2009 в 12:05)
| | Спасибо за ответ. Просто я подумал, что функция md5() сравнивает хеши и если хоть один символ отличается, то они не совпадут, а значит запрос не пройдет. | |
|
|
|
|
|
|
|
для: qsef
(07.07.2009 в 12:11)
| | функция md5 ничего не сравниавает. Она вычисляет хеш своего аргумента.
Но чем писать так, как у Вас, почему не написать прямое сравнение поля с входным параметром скрипта?
Чего Вы добились этим md5? | |
|
|
|
|
|
|
|
для: qsef
(07.07.2009 в 12:11)
| | функция md5() сравнивает хеши
это попытка защититься от подделки имени (замена латиницы кириллицей) или что? | |
|
|
|
|
|
|
|
для: Valick
(07.07.2009 в 12:18)
| | я имею ввиду так: ...WHERE md5(name) = md5($name) | |
|
|
|
|
|
|
|
для: qsef
(07.07.2009 в 12:20)
| | а чем это отличается от этого?
WHERE name = '$name' | |
|
|
|
|
|
|
|
для: Valick
(07.07.2009 в 12:45)
| | Если в $name будет зловредный код, то md5() преобразует его в хеш.
В запросе сравниваются два хеша: ...WHERE md5(name) = md5($name)
если они не совпадают, то и не выполняются. Вот я и спрашиваю, возможна ли здесь атака? | |
|
|
|
|
|
|
|
для: qsef
(07.07.2009 в 12:54)
| | если в $name кавычки уже экранированы - никакого зловредного кода не будет.
Если не экранированы - md5 от зловредного кода никак не спасет.
Пример (для исправленных синтаксических ошибок) :
Судя по тому, что Вы до сих пор ошибку не исправили, весь этот диспут - корм совершенно не в коня.
Пример для Вашего случая :
Формально допуская, однако, что автор кода куда хитрее, чем кажется...
нет. Тогда бы он не стал применять md5 с обеих сторон от знака равенства. | |
|
|
|
|
|
|
|
для: Trianon
(07.07.2009 в 13:41)
| | >Если не экранированы - md5 от зловредного кода никак не спасет.
Вот это я и хотел узнать.
Просто у меня есть запрос:
"SELECT id FROM tbl WHERE name = '$name'";
|
$name - это строка из GET-запроса:
Большое спасибо. | |
|
|
|
|
|
|
|
для: qsef
(07.07.2009 в 17:42)
| | >Просто у меня есть запрос:
>"SELECT id FROM tbl WHERE name = '$name'";
Это не запрос. Это целое выражение вида
"SELECT id FROM tbl WHERE name = '" . $name . "'"
|
которое еще нужно вычислить до того, как его результат может быть станет запросом.
Даже если
>$name - это строка из GET-запроса:
>
А если нет? | |
|
|
|
|
|
|
|
для: Trianon
(07.07.2009 в 18:08)
| | Вообще идея была такая, в выражении сравниваются два хеша, если символы внутри функции md5() разные, то и хеши будут разные и как результат не совпадут.
"SELECT * FROM tbl WHERE md5(alias) = '".md5($name)."'";
|
| |
|
|
|
|
|
|
|
для: qsef
(07.07.2009 в 20:37)
| | этот код принципиально другой. Его даже можно применить без особой опаски.
Хотя опять же неясно, зачем сравнивать хеши, если можно сравнить сами имена. | |
|
|
|
|
|
|
|
для: Trianon
(07.07.2009 в 20:47)
| | Почему хеши? В переменной $name может быть зловредный код и если сравнить его напрямую, то код исполнится(имеется ввиду, что $name необработанная переменная).
А md5() преобразует код в хеш. | |
|
|
|
|
|
|
|
для: qsef
(07.07.2009 в 20:55)
| | >Почему хеши? В переменной $name может быть зловредный код и если сравнить его напрямую, то код исполнится(имеется ввиду, что $name необработанная переменная).
Так обработайте её перед укладыванием в запрос! Зачем же извращаться-то?
На вычисление хеша будет положено на 4 порядка больше ресурсов, чем на экранирование кавычек!
>А md5() преобразует код в хеш.
И? | |
|
|
|
|
|
|
|
для: Trianon
(07.07.2009 в 21:42)
| | >На вычисление хеша будет положено на 4 порядка больше ресурсов, чем на экранирование кавычек!
Ага, понял. Просто возникла такая идея и я спросил.
>И?
И будут сравниваться хеши, а не код, т. е. sql injection будет невозможна. | |
|
|
|
|
|
|
|
для: qsef
(07.07.2009 в 22:14)
| | И будут сравниваться хеши, а не код, т. е. sql injection будет невозможна.
Это далеко не так, не путайте sql запрос с выводом в браузер
Инъекция будет возможна в любом случае при неграмотной обработке входящих данных, не думайте что изобрели "кремлёвскую таблетку".
Пример инъекции Вам привёл Trianon, Вы судя по всему пропустили это мимо ушей, раз до сих пор думаете защититься от зловредов при помощи md5 | |
|
|
|
|
|
|
|
для: Valick
(07.07.2009 в 12:05)
| | за mail() извиняюсь, так вышло... | |
|
|
|