Легенда:
   новое сообщение
    закрытая нитка
    новое сообщение
    в закрытой нитке
    старое сообщение
         
		 | 
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
 - Новичкам также крайне полезно ознакомиться с данным документом.
   
  |   |   |   | 
Ага, вот так и появляются на свет продукты - будущие жертвы SQL-инъекций и прочих шалостей )  01.03.11 00:03  Число просмотров: 7840
 Автор: Fighter <Vladimir> Статус: Elderman
 | 
 
| 
 | 
 
| 
<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 передается скрипту, а не генерится им. А про двойное прослешивание мне уже давно ответили
 | 
 
 
  
 
 | 
 |