Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | |
Смотря для чего. 28.02.11 01:31 Число просмотров: 7012
Автор: Den <Денис Т.> Статус: The Elderman
|
Если не ошибаюсь, POST передает данные от клиента к серверу в защищенном канале. Соответственно, пароль можно передавать через POST не прогоняя его через MD5. Но хранить пароль в базе регистрации "открытым текстом" это, мягко говоря, моветон. И в этом случае, MD5 ,будет вычисляться только на сервере.
|
<web building>
|
Опять вопрос по PHP+SQL 09.12.10 04:17
Автор: Fighter <Vladimir> Статус: Elderman
|
Наткнулся на одном форуме на вот такой пост:
inferno26
$result = mysql_query("SELECT * FROM `users` WHERE email = '".htmlspecialchars(addslashes($_POST['email'])."'AND md5 = '".htmlspecialchars(addslashes($_POST['md5'])."'");
согласен так лучше???
Нет.
Сначала два раза addslashes, а затем уже htmlspecialchars
Зачем вообще нужно обрабатывать md5 и для чего ему советуют два раза использовать addslashes перед заменой тегов?
|
|
Кстати, сразу не отметил, кроме функций со слешами нужно ещё и разум врубать - фильтровать с умом. Та же md5 - это набор hex-цифр длиной 32 символа. В итоге один regexp решит стоит ли вообще отрабатывать запрос или нет. 27.02.11 19:46
Автор: kstati <Евгений Борисов> Статус: Elderman Отредактировано 27.02.11 19:49 Количество правок: 2
|
> $result = mysql_query("SELECT * FROM `users` WHERE email = > '".htmlspecialchars(addslashes($_POST['email'])."'AND md5 = > '".htmlspecialchars(addslashes($_POST['md5'])."'");
> согласен так лучше???
В качестве теста может подойти такой код.
if (!preg_match("^[0-9a-f]{32}$i",$_POST['md5']) {
trow("mistaked md5 data, possible cracker's attack");
}
Ну, а далее уж без запарок помещать переменную в запрос.
|
| |
Ну, если врубать разум, то ответ на мой первый вопрос такой:... 27.02.11 23:07
Автор: Fighter <Vladimir> Статус: Elderman
|
Ну, если врубать разум, то ответ на мой первый вопрос такой: потому, что md5 не вычисляется на стороне сервера, а получается от клиента ;))))
|
| | |
Суть верна, реализация оно ) На фиг слешить hex-последовательность? ) правильнее проверить, а действительно ли переменная имеет ожидаемый тип ) Равно как и цифровые id слешить не надо. Надо убеждаться, что они цифровые, либо приводить к цифре: $id+=0; 28.02.11 19:26
Автор: kstati <Евгений Борисов> Статус: Elderman
|
|
| | | |
Ага, вот так и появляются на свет продукты - будущие жертвы SQL-инъекций и прочих шалостей ) 01.03.11 00:03
Автор: Fighter <Vladimir> Статус: Elderman
|
|
| | | | |
Ошибаешься, сударь. sql-инъекцию забабаешься здесь внедрять ;) А вот фанатеть от слешей - это нелепо. 01.03.11 01:19
Автор: kstati <Евгений Борисов> Статус: Elderman Отредактировано 01.03.11 01:31 Количество правок: 2
|
Кроме того за слеши и квотирование ПЕРЕД внесением в бд прибивать надо. Если данные верны - то они и храниться должны так, как и были введены.
Попробуй-ка организовать редактирование статей при использовании addslashes, html_specialchars ДО внесеня в бд.
А текст бусть будет из одной строки:
"Tom & Jery"
отслешил, да заквотировал - получил:
\"Tom & Jery \"
Что б подобную гадость отдать в поле редактирования textarea придётся убирать квотирование вручную. И как раз на этом этапе можно легко накосячить. Особенно, если значение Magic_Quotes отличается от сервера к серверу.
Более правильный вариант:
1. проверка входных данных на соответствие ожидаемому типу.
2. избегание прямого размещения переменных в запросах. Мне понравилось решение Котерова DbSimple, как реализация функционала pg_prepare
3. Отсутствие искажения данных вносимых в бд
4. Качественная отработка вывода данных полученных из бд.
Пара примеров проверки типов:
<?
$_POST['id']="I'm c00l haxor"
$id = $_POST['id'];
$id+=0;
echo $id;
?> ---
Аналогично - проверка на заранее безопасный тип данных [0-9a-f]{32}
if (!preg_match("^[0-9a-f]{32}$i",$_POST['md5']) {
trow("mistaked md5 data, possible cracker's attack");
} ---
разумеется в sql-запрос переменные подставляться должны после квотирования необходимого для используемой субд. касательно mysql решение в лоб - mysql_real_escape, решение с удобствами - уже описал.
|
| | | | | |
У меня ощущение, что ты только закончил читать Котерова (или Котерова с Костаревым?8) ) и спешишь рассказать все, что там узнал ;) 01.03.11 02:07
Автор: Fighter <Vladimir> Статус: Elderman
|
|
| | | | | | |
Зато я чётко вижу, что ты заблуждаешься не только в кодинге, но и в суждениях о других :) 01.03.11 15:59
Автор: kstati <Евгений Борисов> Статус: Elderman
|
|
| | | | | | | |
Ну, с кодингом у тебя, вроде, нормально, а вот о чем писал я - ты так и не понял ) 01.03.11 17:34
Автор: Fighter <Vladimir> Статус: Elderman
|
Так что, не знаю как с первым, но во втором мы видимо коллеги... ;)
|
| | | | |
Не обязательно парсить всё подряд. 01.03.11 00:56
Автор: Den <Денис Т.> Статус: The Elderman
|
Если тебе по get или post пришли данные, которые ты должен интерпретировать как целое число, то слешить и проверять не обязательно, достаточно прогнать через функцию приобразования строки в целое число и хранить до востребования как переменную типа integer.
|
| | |
Смотря для чего. 28.02.11 01:31
Автор: Den <Денис Т.> Статус: The Elderman
|
Если не ошибаюсь, POST передает данные от клиента к серверу в защищенном канале. Соответственно, пароль можно передавать через POST не прогоняя его через MD5. Но хранить пароль в базе регистрации "открытым текстом" это, мягко говоря, моветон. И в этом случае, MD5 ,будет вычисляться только на сервере.
|
| | | |
Ошибаешься. Если ты не включил защищенный режим, то браузер... 28.02.11 02:27
Автор: Fighter <Vladimir> Статус: Elderman
|
> Если не ошибаюсь, POST передает данные от клиента к серверу > в защищенном канале. Соответственно, пароль можно Ошибаешься. Если ты не включил защищенный режим, то браузер за тебя его сам включать не будет
> передавать через POST не прогоняя его через MD5. Но хранить > пароль в базе регистрации "открытым текстом" это, мягко > говоря, моветон. И в этом случае, MD5 ,будет вычисляться > только на сервере. Это все до %опы, тем более что MD5 необратима, и нам не известно считали ее для пароля или порнофильма. В общем случае, запись $_POST['md5'] обещает, что форма имела текстовое поле с именем 'md5' и ее содержимое было передано методом $_POST. Но, на то, что это так, мы только надеемся. На самом деле, как всегда, предполагаем худшее: не было никакой формы, а пришедший в запросе набор данных сформировал злой кулхацкер А Си Сяй, возжелавший наше все.
|
| | | | |
Не много не в тему, про использование Md5 для создания динамических ключей-авторизации и о DbSimple 28.02.11 19:23
Автор: kstati <Евгений Борисов> Статус: Elderman
|
> > Если не ошибаюсь, POST передает данные от клиента к > серверу > > в защищенном канале. Соответственно, пароль можно > Ошибаешься. Если ты не включил защищенный режим, то браузер > за тебя его сам включать не будет > > передавать через POST не прогоняя его через MD5. Но > хранить > > пароль в базе регистрации "открытым текстом" это, > мягко > > говоря, моветон. И в этом случае, MD5 ,будет > вычисляться > > только на сервере. > Это все до %опы, тем более что MD5 необратима, и нам не > известно считали ее для пароля или порнофильма. В общем > случае, запись $_POST['md5'] обещает, что форма имела > текстовое поле с именем 'md5' и ее содержимое было передано > методом $_POST. Но, на то, что это так, мы только надеемся. > На самом деле, как всегда, предполагаем худшее: не было > никакой формы, а пришедший в запросе набор данных > сформировал злой кулхацкер А Си Сяй, возжелавший наше все. Угу, тем более, что реализаций md5-js уже до фени, а хозяин сайта (кодер как минимум) должен знать какой тип переменной используется фронт-эндом.
И небольшое увеличение защищённости можно делать как... md5(md5(password)+captcha) то есть использовать сессионные ключи. В результате на сервере может храниться хэш пароля, а сравниваться он будет с повторным хэшем источника и соли.
при установке пароля в бд вносится md5(pass) = md5pass
в форме авторизации висит и каптча, на сервер возвращается, например,
$_POST['checksum'] = md5(md5(pass)+captha)
сервер зная md5pass легко проверит правильность связки пароль + каптча например так.
select id from users where md5(md5pass+'$captcha') == '$checksum';
К слову сказать, мне оч нравится идея sqlite да postgree с подготовкой запросов. Тот же pg_prepare:
$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets")); ---
Аналогичные плюшки разработаны и для Mysql. На вскидку - Котеров написал неплохую либу. Грех не воспользоваться ею. Разумеется, прочитав исходники да описание многие вещички станут на свои места.
DbSimple
|
| | | | | |
Ну-ну... Блаженны верующие ;) Хозяин уверен, что знает.И,... 01.03.11 00:01
Автор: Fighter <Vladimir> Статус: Elderman
|
> > > Если не ошибаюсь, POST передает данные от клиента > к > > серверу > > > в защищенном канале. Соответственно, пароль можно > > Ошибаешься. Если ты не включил защищенный режим, то > браузер > > за тебя его сам включать не будет > > > передавать через POST не прогоняя его через MD5. > Но > > хранить > > > пароль в базе регистрации "открытым текстом" это, > > мягко > > > говоря, моветон. И в этом случае, MD5 ,будет > > вычисляться > > > только на сервере. > > Это все до %опы, тем более что MD5 необратима, и нам > не > > известно считали ее для пароля или порнофильма. В > общем > > случае, запись $_POST['md5'] обещает, что форма имела > > текстовое поле с именем 'md5' и ее содержимое было > передано > > методом $_POST. Но, на то, что это так, мы только > надеемся. > > На самом деле, как всегда, предполагаем худшее: не > было > > никакой формы, а пришедший в запросе набор данных > > сформировал злой кулхацкер А Си Сяй, возжелавший наше > все. > Угу, тем более, что реализаций md5-js уже до фени, а хозяин > сайта (кодер как минимум) должен знать какой тип переменной > используется фронт-эндом. Ну-ну... Блаженны верующие ;) Хозяин уверен, что знает.И, пока данные шлет его фронт-энд, это так и есть. Но фронт-энд может сварганить кто-то другой и поэтому и приходится извращаться с фильтрацией, экранированием, проверками... Кстати, вместо md5 лучше использовать sha1.
> > И небольшое увеличение защищённости можно делать как... > md5(md5(password)+captcha) то есть использовать сессионные > ключи. В результате на сервере может храниться хэш пароля, Должен. Не "может", а должен. Пароли в чистом или обратимо зашифрованном виде уже даже мелкософт лет десять-двенадцать как хранить перестал.
> а сравниваться он будет с повторным хэшем источника и соли. Что есть такое "соли"?
> > при установке пароля в бд вносится md5(pass) = md5pass > в форме авторизации висит и каптча, на сервер возвращается, > например, > $_POST['checksum'] = md5(md5(pass)+captha) > сервер зная md5pass легко проверит правильность связки > пароль + каптча например так. > > select id from users where md5(md5pass+'$captcha') == > '$checksum'; > > К слову сказать, мне оч нравится идея sqlite да postgree с > подготовкой запросов. Тот же pg_prepare: > $result = pg_prepare($dbconn, "my_query", > 'SELECT * FROM shops WHERE name = $1');
> $result = pg_execute($dbconn, "my_query", array("Joe's
> Widgets")); ---
> > Аналогичные плюшки разработаны и для Mysql. На вскидку - > Котеров написал неплохую либу. Грех не воспользоваться ею. > Разумеется, прочитав исходники да описание многие вещички > станут на свои места. Рекомендую забить на нее и использовать mysqli. Там есть все и даже больше.
|
| | | | | | |
О чём вы, сударь? Фильтрация и экранирование - это крайние... 01.03.11 01:28
Автор: kstati <Евгений Борисов> Статус: Elderman Отредактировано 01.03.11 16:17 Количество правок: 4
|
> Ну-ну... Блаженны верующие ;) Хозяин уверен, что знает.И, > пока данные шлет его фронт-энд, это так и есть. Но > фронт-энд может сварганить кто-то другой и поэтому и > приходится извращаться с фильтрацией, экранированием, > проверками... О чём вы, сударь? Фильтрация и экранирование - это крайние меры. Правильное решение - проверка на соответствие ожидаемому типу данных. Нормальный пользователь просто не сможет внедрить в поле md5 что-либо, а ненормальных - в баню.
А ну-ка показывай пример как можно прорвать этот шаблон! ;)
if (!preg_match("^[0-9a-f]{32}$i",$_POST['md5']) {
trow("mistaked md5 data, possible cracker's attack");
} ---
> Кстати, вместо md5 лучше использовать sha1. Читай md5, как "некий удобный алгоритм хеширования, который в принципе не имеет значения". Не принципиально - сути не меняет.
>> В результате на сервере может храниться хэш пароля,
> Должен. Не "может", а должен. Пароли в чистом или обратимо > зашифрованном виде уже даже мелкософт лет десять-двенадцать > как хранить перестал. >> а сравниваться он будет с повторным хэшем источника и соли.
> Что есть такое "соли"? Не стоит рвать предложение:
Уточняю чуть другими словами.
Сервер может хранить хэш, а сравнение проводить, используя простую функцию f(hash+salt)
Солью в данном случае отлично служит капча.
В качестве f может быть что угодно. На вскидку всё тот же md5
Нет смысла в необратимо-хэшированном пароле если хэш одинаковый от сессии к сессии.
> Рекомендую забить на нее и использовать mysqli. Там есть > все и даже больше. Не думаю, что это решение идеально, я предпочитаю писать не привязываясь к конкретным расширениям, ибо далеко не везде они могут быть.
И да, разумеется в php были баги типа внедрения нулевого символа в строку - подобные фишки нужно помнить, но не стоит заморачиваться на них. Не надо быть параноиком, а просто иметь в виду в каком из мест надо обратить внимание. При использовании функций типа pg_prepare эта проблема уходит в никуда.
Про нуль можно почитать, например, по ссылке.
null-byte-injection
|
| | | | | | | |
У меня ощущение, что отвечающие читают только знакомые слова, не напрягаясь понять написанное в целом. 01.03.11 02:02
Автор: Fighter <Vladimir> Статус: Elderman Отредактировано 01.03.11 02:02 Количество правок: 1
|
> > Ну-ну... Блаженны верующие ;) Хозяин уверен, что > знает.И, > > пока данные шлет его фронт-энд, это так и есть. Но > > фронт-энд может сварганить кто-то другой и поэтому и > > приходится извращаться с фильтрацией, экранированием, > > проверками... > О чём вы, сударь? Фильтрация и экранирование - это крайние О проверках, уважаемый! И о фильтрации с экранированием при необходимости.
> меры. Правильное решение - проверка на соответствие > ожидаемому типу данных. Нормальный пользователь просто не > сможет внедрить в поле md5 что-либо, а ненормальных - в > баню. Слушай, ты вообще о чем? Чего ты с этим md5 носишься как дурень с писаной торбой... Злоумышленник не будет использовать веб-форму на твоем сайте и/или сервере. Ему твой фронт-энд до %опы если только он не позволяет использовать известные злоумышленнику дыры.
> > А ну-ка показывай пример как можно прорвать этот шаблон! ;) > > if (!preg_match("^[0-9a-f]{32}$i",$_POST['md5']) {
> trow("mistaked md5 data, possible cracker's attack");
> } ---
На хуя мне это нужно и что ты пытался мне доказать написав это? Что знаком с регэкспами?
> > > > Кстати, вместо md5 лучше использовать sha1. > Читай md5, как "некий удобный алгоритм хеширования, который > в принципе не имеет значения". Не принципиально - сути не > меняет. > > >> В результате на сервере может храниться хэш > пароля, > > Должен. Не "может", а должен. Пароли в чистом или > обратимо > > зашифрованном виде уже даже мелкософт лет > десять-двенадцать > > как хранить перестал. > >> а сравниваться он будет с повторным хэшем > источника и соли. > > Что есть такое "соли"? > Не стоит рвать предложение: Не стоит писать всякую хрень. Включи разум, перечитай тебе написанное и подумай что именно тебе писали.
> Уточняю чуть другими словами. > Сервер может хранить хэш, а сравнение проводить, используя > простую функцию f(hash+salt) > Солью в данном случае отлично служит капча. > В качестве f может быть что угодно. На вскидку всё тот же > md5 > Нет смысла в необратимо-хэшированном пароле если хэш > одинаковый от сессии к сессии. > > > > Рекомендую забить на нее и использовать mysqli. Там > есть > > все и даже больше. > Не думаю, что это решение идеально, я предпочитаю писать не > привязываясь к конкретным расширениям, ибо далеко не везде > они могут быть. Ога, рекомендуемая тобой библиотека есть везде )))
> > И да, разумеется в php были баги типа внедрения нульевого > символа в строку - подобные фишки нужно помнить, но не > стоит заморачиваться на них. Не надо быть параноиком, а > просто иметь в каком из мест надо обратить внимание. При > использовании функций типа pg_prepare эта проблема уходит в > никуда. > Про нуль можно почитать, например, по ссылке.
|
| | | | | | | | |
Не стоит материться, даже если твои аргументы исчерпаны )) 01.03.11 16:13
Автор: kstati <Евгений Борисов> Статус: Elderman
|
> На хуя мне это нужно и что ты пытался мне доказать написав > это? Что знаком с регэкспами? Псих ты )) не видишь очевидного.
Это простая проверка
Аналогично как при вводе цифрового пин-кода слеши и прочая ерись не нужны. Достаточно убедиться, что введены именно цифры.
> Не стоит писать всякую хрень. Включи разум, перечитай тебе > написанное и подумай что именно тебе писали. Как я тебя понимаю ))
> Ога, рекомендуемая тобой библиотека есть везде ))) Это сырец, который легко внедряется в проект. Настройки сервера не имеют значения.
|
| | | | | | | | | |
Тут обязательно станешь психом)) Я же кучу постов пытаюсь... 01.03.11 17:47
Автор: Fighter <Vladimir> Статус: Elderman
|
> > На хуя мне это нужно и что ты пытался мне доказать > написав > > это? Что знаком с регэкспами? > Псих ты )) не видишь очевидного. Тут обязательно станешь психом)) Я же кучу постов пытаюсь объяснить, что мне это все и так понятно, а вопрос про md5 был вызван только тем, что я не заметил $_POST и решил, что автор вопроса обрабатывает результат вызова md5(), и его зачем-то в этом поддерживают.
> Это простая проверка > Аналогично как при вводе цифрового пин-кода слеши и прочая > ерись не нужны. Достаточно убедиться, что введены именно > цифры. Полностью с тобой согласен, но копипастерам лень это делать, им проще вызвать addslashes().
> > > Не стоит писать всякую хрень. Включи разум, перечитай > тебе > > написанное и подумай что именно тебе писали. > Как я тебя понимаю )) Ох, надеюсь )
> > > Ога, рекомендуемая тобой библиотека есть везде ))) > Это сырец, который легко внедряется в проект. Настройки > сервера не имеют значения.
|
| | | | | | | | |
тебе обработку md5 приводят в качестве хорошего и наглядного... 01.03.11 02:38
Автор: Den <Денис Т.> Статус: The Elderman
|
> Слушай, ты вообще о чем? Чего ты с этим md5 носишься как > дурень с писаной торбой... Злоумышленник не будет > использовать веб-форму на твоем сайте и/или сервере. Ему > твой фронт-энд до %опы если только он не позволяет > использовать известные злоумышленнику дыры.
тебе обработку md5 приводят в качестве хорошего и наглядного примера. Если бы ты до конца дофтыкал тему парсинга параметров get/post ты бы понял, что на одном прослешивании свет клином не сошелся. Существует еще несколько способов корректно обработать полученные данные и поместить их в БД без риска выполнить sql инъекцию. А там пусть хоть telnet в роли фронт-энда - пофигу!
> > А ну-ка показывай пример как можно прорвать этот > шаблон! ;) > > > > if (!preg_match("^[0-9a-f]{32}$i",$_POST['md5']) {
> > trow("mistaked md5 data, possible cracker's attack");
> > } ---
> На хуя мне это нужно и что ты пытался мне доказать написав > это? Что знаком с регэкспами?
никак не пойму - толи ты реально протормаживаешь, толи прикидываешься.
если ты используешь приведенный шаблон, то хоть десять sql инъекций засунь - нифига у тебя не выйдет. При этом, ничего прослешивать не требуется.
|
| | | | | | | | | |
Ты дурак или прикидываешься? Нахуя мне этот пример и твои объяснения про md5? 01.03.11 10:36 Штраф: 20 [Den, Fighter]
Автор: Fighter <Vladimir> Статус: Elderman
|
ИМХО, дурак: умные уже давно поняли, что изначально я просто не обратил внимания, что md5 передается скрипту, а не генерится им. А про двойное прослешивание мне уже давно ответили
|
|
|