Поступило сообщение (http://seclists.org/fulldisclosure/2011/Mar/309) об успешном взломе сайтов MySQL.com и Sun.com, а также некоторых связанных с ними субпроектов. Примечательно, что проникновение было совершено через простейшую уязвимость, позволившую осуществить подстановку SQL-кода (http://ru.wikipedia.org/wiki/%D0%92%D0%B...из-за некорректной проверки одного из параметров скрипта, используемого для предоставления клиентских сервисов. По доступным в настоящий момент данным, взлом ограничился только доступом к СУБД. Пока нет никаких сведений, указывающих на то, что атакующим удалось получить доступ к серверу или web-движку.
Атакующие уже опубликовали в открытом доступе список всех обслуживаемых на взломанном сервере баз данных и перечень некоторых таблиц. В одной из таблиц содержался список пользователей и администраторов СУБД. Большинство паролей для пользователей в данном списке было представлено в виде ...URL: http://techie-buzz.com/tech-news/mysql-com-database-compromi...
Новость: http://www.opennet.me/opennews/art.shtml?num=30043
не, народ, вы конечно комменты режете, но реально из-за некорректной проверки какого именно скрипта - пыхпых, jsp, что?а то такое чувство складывается из названия, что взломали сам мускуль, а там - скрипты и быдлокодинг.
JSP не является скриптом. Плюс обычно (если прочитали как програть на java) JSP ходят в БД через prepareStatement или JPA. и то и другое работают без конкатенации запроса, а значит SQL-inject им не светит.PS только архитектор мешает бывшим PHP-кодерам писать так же на JSP.
бросьте, писать быдло-код не может помешать любой язык, будь то php или java.
и не нужно такого снобизма. ибо ынтырпрайзный код я тоже насмотрелся.
хотите скажу какой пароль у ключа, подписывающего jar от oebs? :D
зыж
>JSP (JavaServer Pages) — технология, позволяющая веб-разработчикам легко создавать содержимое, которое имеет как статические, так и динамические компоненты. По сути, страница JSP является текстовым документом, который содержит текст двух типовможете НЕ называть это скриптом, ради бога, я не возражаю. но если чё, то пыхпых-скрипты тоже можно скомпилить.
хотя для простоты общения я всё равно назову их скриптами.
ззыж
>Плюс обычно (если прочитали как програть на java) JSP ходят в БД через prepareStatementчто не мешает генерить строку запроса динамически, не так ли? :D
> бросьте, писать быдло-код не может помешать любой язык, будь то php или java.Если задаться целью, то да, отвратительный код достижим на любом языке. Вот только быдлокодеры не специально пишут код с инъекциями - у них это получается без всякого труда, и, соответственно, иногда их достаточно пересадить на более вменяемый язык или платформу. В пых-пыхе до сих пор некоторые используют mysql_query (), поскольку иной удобной искоробочно-доступной альтернативы просто нет
>Вот только быдлокодеры не специально пишут код с инъекциями - у них это получается без всякого труда, и, соответственно, иногда их достаточно пересадить на более вменяемый язык или платформу.одним словом - бред.
Изкаробочная альтернатива в PHP - PDO.В Java кроме PreparedStatement есть еще и Statement, который при неумелом использовании может приводить к SQL Injection.
> Изкаробочная альтернатива в PHP - PDO.
> В Java кроме PreparedStatement есть еще и Statement, который при неумелом использовании
> может приводить к SQL Injection.Для любителей пристрелить себя из каропки есть JPA - пользуйте его для SQL injection.
а вы хоть понимаете ваще для чего нужны препарации запроса ? да правильно чтобы 10 раз не парсить 10 запросов а подставлять значения (хорош для инсертов и апдейтов). имхо для обычного селекта - накладные расходы
> что не мешает генерить строку запроса динамически, не так ли? :DЕсли человек так сильно хочет прострелить себе ногу - ничто не сможет его остановить.
именно.зыж
я понимаю, сей инцидент есть крЮтой повод провести маркетинговые пляски и пропиарить то или иное решение (прадон, платформу!!! и никак иначе :D).
а реальность такова - слабые знания, слабый аудит кода и банальная халатность.
то что маркетологи (уже после внедрения ПЛАТФОРМЫ) называют скромно - человеческий фактор, что же вы хотите?.
> Если человек так сильно хочет прострелить себе ногу - ничто не сможет
> его остановить.Быдлокодер не хочет стрелять именно себе в ногу осознанно. Он просто пишет код, не думая о том что кто-то может мыслить чуть креативнее чем сам быдлокодер с его полутора извилинами и поэтому внешние данные могут содержать очень странные значения :).
>> Плюс обычно (если прочитали как програть на java) JSP ходят в БД через prepareStatement
> что не мешает генерить строку запроса динамически, не так ли? :DЭто как С++ мне выдал, что в java можно получить утечку памяти - создать статический указатель на список и бесконечно его заполнять =)))
Вот так обрезают доступный функционал - а потом удивляются, почему их "ентерпрайзное" поделие ворочается в 100500 раз медленнее нормальными руками написанного кода.А быдлокодеров надо просто к коду не пускать, и все будет хорошо.
Как раз java и подходит для быдло-кодеров. Один грамотный надсмотрщик-архитектор и 10-к кодеров пишут работающий софт.
> JSP не является скриптом.Скриптом называется код, который на лету интерпретируется в машинный код целевого железа (неважно, через промежуточный байткод для скорости или без него), и *.jsp файлы на x86 или amd64 именно это из себя и представляют.
новость закономерная. лично я уже давно успел подивиться, что они используют fedora и прочее барахло.
вот из-за таких скороспелых аналитегов такие сабжы в основном и случаются кстати.
зыж
странно что новость не назвали "взлом федоры с селинухом".
такое название имело такое же право на существование как и текущее.
Дело не в том, что "Федору сломали", а в том, что люди, которые ставят ее на сервера и в других местах налажают. Народная мудрость подтвердилась.
сори, но бред.
тем более что ставят федору одни, а скрипты на пыхпыхе уж точно пишут совсем другие.
сомневаюсь что этот сиквел-инжекшн сам собой бы затянулся, если бы стоял к примеру на соляре. ну а винду бы сломали ещё до обнаружения этой дырки.
В крупных компаниях есть должности, на которых утверждают весь стек технологий и одобряют конкретные решения. Это не так что программер сказал: PHP! Админ: Fedora! Они пожали друг другу руки и стало так.
То есть кто-то а) нанял админа, который поставил Fedora и не заморачивался обновлением и б) программера, который написал плохой код.
Ну и еще мне странно, почему они правда родной Solaris не поставили. Это мягко говоря странно.
ну и кто утверждает этот стэк? :D
ведь вы так и не сказали.
а реально утверждает архитект, которому подчиняется тот программер и еще толпа, и начальник управления тех поддержки, которому подчиняется тот админ и еще толпа.
и это кончно кардинально меняет дело. :Dзыж
так заросла бы (или рассосалась) сия дыра на соляре (или rhel) или нет?
или тут бы последовал следующий аргумент вида "надо было этот сиквел-инжекшион делать на жа.. впрочем подставить очередную панацею".
а да! забыл еще один аргумент!
надо было делать не на быдло-мускуле, а на оракле или дб2.
> а да! забыл еще один аргумент!
> надо было делать не на быдло-мускуле, а на оракле или дб2.нет никакой разницы - взлом прошел через PHP и его базовые либы. Для java либы сделаны более качественно + разнесение на слои принуждает к иному подходу.
Думаю, что С/С++ либы для коннекта к СУБД тоже более грамотные, чем PHP. Хотя утверждать не буду ;)))
>нет никакой разницы - взлом прошел через PHP и его базовые либы.вы уверены что такое sql-injection? или думаете на жабе нельзя написать прогу так, что запрос - SELECT fieldlist FROM table WHERE field = '$EMAIL';
превратиться в - SELECT fieldlist FROM table WHERE field = '$EMAIL' AND email IS NULL;
рекомендую для ознакомления чтобы херню не писать - http://www.owasp.org/index.php/Preventing_SQL_Injection_in_Javaзыж
базовые библиотеки свою работу выполнили - запрос был отработан полностью и без ошибок! :D
вот пример на жабе:conn = pool.getConnection( );
String sql = "select * from user where username='" + username +"' and password='" + password + "'";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) {
loggedIn = true;
out.println("Successfully logged in");
} else {
out.println("Username and/or password not recognized");
}быдло жаба? и её базовые либы? не? :D
Так пишут только моральные уроды и самоубийцы.
> Так пишут только моральные уроды и самоубийцы.Но написать указанное выше можно на любом языка программирования.
> Так пишут только моральные уроды и самоубийцы.немного не соглашусь
что повашему он должен был создать кучу наследуемых обёрток классов?
использовать prepareStatement и передавать параметры как параметры. Или использовать JPA, если прямой JDBC слишком сложен :)
Нет. Один раз изучить JPA и писать как человек
наивный ?
> или думаете на жабе нельзя написать прогу так, что запрос - SELECT fieldlist FROM table WHERE field = '$EMAIL';
> превратиться в - SELECT fieldlist FROM table WHERE field = '$EMAIL' AND email IS NULL;да, вы правы. PHP кодеров не стоит брать в качестве разработчика.
попробуйте провернуть то же самое на JPA ;)
Еще стоит посмотреть как происходить работа UI и системы - данные передаются типизированными. И такими же уходят в БД.
Хотя вариант создать статик и набить объектами до окончания памяти убьет любой язык.
>да, вы правы. PHP кодеров не стоит брать в качестве разработчика.я этого не говорил. :D
а вот то, что жабаписцы такие же и в тех же пропорциях - это да. подтверждаю. :D
>> или думаете на жабе нельзя написать прогу так, что запрос - SELECT fieldlist FROM table WHERE field = '$EMAIL';
>> превратиться в - SELECT fieldlist FROM table WHERE field = '$EMAIL' AND email IS NULL;
> да, вы правы. PHP кодеров не стоит брать в качестве разработчика.
> попробуйте провернуть то же самое на JPA ;)
> Еще стоит посмотреть как происходить работа UI и системы - данные передаются
> типизированными. И такими же уходят в БД.
> Хотя вариант создать статик и набить объектами до окончания памяти убьет любой
> язык.пхп быдло-кодеры порой намного лучше пишут чем теже быдло-кодеры на яве (почему ? - адназначна - пэхэпэ легче)
ага SQL-inject сделать на PHP однозначно легче.
> ага SQL-inject сделать на PHP однозначно легче.и намного легче написать безопасное приложение
нежеле в яве городить огород
>>> или думаете на жабе нельзя написать прогу так, что запрос - SELECT fieldlist FROM table WHERE field = '$EMAIL';
>>> превратиться в - SELECT fieldlist FROM table WHERE field = '$EMAIL' AND email IS NULL;
>> да, вы правы. PHP кодеров не стоит брать в качестве разработчика.
>> попробуйте провернуть то же самое на JPA ;)
>> Еще стоит посмотреть как происходить работа UI и системы - данные передаются
>> типизированными. И такими же уходят в БД.
>> Хотя вариант создать статик и набить объектами до окончания памяти убьет любой
>> язык.
> пхп быдло-кодеры порой намного лучше пишут чем теже быдло-кодеры на яве (почему
> ? - адназначна - пэхэпэ легче)да. на пхп легче писать большие обьемы кода для маленьких программ. Для сравнения: на java писать сложнее и меньше для аналогичных программ. Каждый выбирает себе язык по способностям: кто хорошо набирает тексты а кто и программирует хорошо (да-да есть и такие!:))
>[оверквотинг удален]
>>> Еще стоит посмотреть как происходить работа UI и системы - данные передаются
>>> типизированными. И такими же уходят в БД.
>>> Хотя вариант создать статик и набить объектами до окончания памяти убьет любой
>>> язык.
>> пхп быдло-кодеры порой намного лучше пишут чем теже быдло-кодеры на яве (почему
>> ? - адназначна - пэхэпэ легче)
> да. на пхп легче писать большие обьемы кода для маленьких программ. Для
> сравнения: на java писать сложнее и меньше для аналогичных программ. Каждый
> выбирает себе язык по способностям: кто хорошо набирает тексты а кто
> и программирует хорошо (да-да есть и такие!:))хех - сравним ?
>Каждый выбирает себе язык по способностямЭто просто приступ снобизма. и СМВ.
Или банальный троллинг.
>>разнесение на слои принуждает к иному подходуна какие слои ?
просто в препарациях проверяются типы данных (что есть в пэхэпэ и той же в яве)
дело не в либах, а в кривых руках даже не быдло-кодеров, а быдлокодеров sql синтаксиса и реализация протокола вотъ
пс: если запретить коментарии в sql запросах то ни одна фактически инъекция не пройдёт (при том что параметр будет обрамлён кавычками)
чтобы программирование было безопасным - надо ужесточать правила программирования (тады и быдлокодеров меньше будет)
> просто в препарациях проверяются типы данных (что есть в пэхэпэ и той же в яве)Эээ.. Простите, какие типы данных? Где проверяются? Кем? И причем тут PHP, Java или кто-либо ещё? И чем работа с ps на языке A принципиально отличается от оной на языке Б :-?
> дело не в либах, а в кривых руках даже не быдло-кодеров, а быдлокодеров sql синтаксиса и реализация протокола вотъ
Какого именно протокола? Удаленного доступа к базе? Сколько баз - столько протоколов. Какого то одного или всех скопом?
>> просто в препарациях проверяются типы данных (что есть в пэхэпэ и той же в яве)
> Эээ.. Простите, какие типы данных? Где проверяются? Кем? И причем тут PHP,
> Java или кто-либо ещё? И чем работа с ps на языке
> A принципиально отличается от оной на языке Б :-?
>> дело не в либах, а в кривых руках даже не быдло-кодеров, а быдлокодеров sql синтаксиса и реализация протокола вотъ
> Какого именно протокола? Удаленного доступа к базе? Сколько баз - столько протоколов.
> Какого то одного или всех скопом?
>>Эээ.. Простите, какие типы данных? Где проверяются? Кем? И причем тут PHP, Java или кто-либо ещё?вы не в теме ?
> вы не в теме ?Судя по всему нет, не в теме. Разъясните?
>> вы не в теме ?
> Судя по всему нет, не в теме. Разъясните?учите матчасть - удачи
А на пальцах? А с пруфлинками?
Может вы тоже не в теме?
> А на пальцах? А с пруфлинками?
> Может вы тоже не в теме?смотрите каменты ниже там пруфы
нету там.
приводи тут. или просто врёшь.
вот комент http://www.opennet.me/opennews/art.shtml?num=30043#44
а вот пруфыhttp://download.oracle.com/javase/tutorial/jdbc/basics/prepa...
http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Pr...
http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Pr...
ну и какие там слои?
очередное враньё.
>>>разнесение на слои принуждает к иному подходу
> на какие слои ?DAO, DTO, Services и т.п.
> просто в препарациях проверяются типы данных (что есть в пэхэпэ и той
> же в яве)Вы не работали в javaEE проектах, потому и не въехали. В Java типы данных не проверяюся!!! совсем. В java данные в код приходят типизированными. За типизацию отвечает сами подсистема JavaEE.
> дело не в либах, а в кривых руках даже не быдло-кодеров, а
> быдлокодеров sql синтаксиса и реализация протокола вотъSQL очень даже хороший синтаксис.
> пс: если запретить коментарии в sql запросах то ни одна фактически инъекция
> не пройдёт (при том что параметр будет обрамлён кавычками)А как это связано? харе думать по PHP и собирать SQL строки. разделение запросов и переменных сделано давно, только далеко не все достаточно образованы чтобы этим пользоваться.
> чтобы программирование было безопасным - надо ужесточать правила программирования (тады
> и быдлокодеров меньше будет)Java вполне себе жесткие правила вводит. Только некоторые аморальные анонимы вместо prepareStatement так и наровят сканкотенировать строку и отправить в БД.
> Java вполне себе жесткие правила вводит. Только некоторые аморальные анонимы вместо prepareStatement так и наровят сканкотенировать строку и отправить в БД.$ids = array();
.....
$sql = 'DELETE FROM SomeTable WHERE record_id IN ('.implode(',', $ids).')';PS тут не помогут. By design. При том что это существенно эффективнее, чем N отдельных операций удаления. Вопрос лишь в том, что как только девелупер встал на этот скользкий путь - конструирование SQL запросов руками - он должен четко отдавать себе отчет в том, где он находится, что он делает и как он это делает.
>$ids = array();
>.....
>$sql = 'DELETE FROM SomeTable WHERE record_id IN ('.implode(',', $ids).')';Это делается так с помощью PDO:
$sql = 'DELETE FROM SomeTable WHERE record_id IN ('.rtrim(str_repeat("?,", count($ids)),',').')';
$sth = $dbh->prepare($sql);
$sth->execute($ids);Само-собой вставку вопросиков лучше разбить на несколько строк (для более лёгкой читаемости), и перенести в функцию (т.к. всё равно в коде будем юзать не один раз)
Вот, собственно, пока такого не будет во встроенных функциях, быдлокодеры этим пользоваться не будут.Но SQL - это идиотизм сам по себе. Просто поразительно, как "близкий к естественному" язык для менеджеров" прижился в программировании. С упорядоченностью элементов запроса (к примеру, нельзя перемешать FROM и WHERE), с необходимостью пихать бестолковые AND и OR и тому подобным. Хотя для программизма можно было бы сделать что-нибудь гораздо более удобное для генерации, как минимум с допустимостью любого порядка элементов запроса и конкатенацией повторяющихся элементов (т.е. если пишем подряд два FROM, к примеру, то их содержимое объединяется), с возможностью подстановки любых при выполнении, а не только значений параметров (например, чтобы имя таблицы подставлялось или порядок сортировки). Да, в отдельных случаях такое не будет препариться - но обычно оно и не надо. То есть должны быть две разные функции - "указать шаблон запроса" со смыслом "это каркас, который не должен меняться, а должны только подставляться указанные элементы" и "подготовить запрос" со смыслом "выполнить сто раз с разными аргументами".
А сейчас любимый аргумент борцом с PREPARE - его ограниченность. Ни JOIN динамически не сделаешь, ни списко полей не задашь...
>>DAO, DTO, Services и т.п.и кучу ненужных обёрток (быстрои маоенький код как сказал выше один гражданин) ))) спасибо поржал
>>Вы не работали в javaEE проектах, потому и не въехали. В Java типы данных не проверяюся!!! совсем. В java данные в код приходят типизированными. За типизацию отвечает сами подсистема JavaEE.
ага )))) приходят уже типизированные (и правильно заметили - приводят к типу который бесмысленен) ибо для mysql-а выбирать запрос по колонке int в кавычка или без них совершенно безразлично (можем писать так WHERE id=1, можем и так WHERE id='1')
и вся беда из-за коментариев в sql которые позволяют коментить хвост запроса (реального)
всё это криворукая реаоизация mysql
на сколько я помню в mssql написать так WHERE id='1' для int поля является ошибкой
>>SQL очень даже хороший синтаксис.смотрим выше
>>только далеко не все достаточно образованы чтобы этим пользоваться.
и далеко не все поняли для чего ваще сделали препарацию запроса
вот вам пруфы и посмотрите для чего ваще создавали препарацию
http://download.oracle.com/javase/tutorial/jdbc/basics/prepa...
http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Pr...
http://www.jdbc-tutorial.com/jdbc-prepared-statements.htmне для селекта (который делается один раз во всей программе) ведь
>>Java вполне себе жесткие правила вводит. Только некоторые аморальные анонимы вместо prepareStatement так и наровят сканкотенировать строку и отправить в БД.знаете мне один раз мой ментор сказал - и "мобильником гвозди забивать можно"
>>Только некоторые аморальные анонимы вместо prepareStatement так и наровят сканкотенировать строку и отправить в БД.а почему бы и нет ? зачем городить всякую фигню если можно одним разом попроправит sql синтаксис (и ваще как я вижу его и нехотят править - и вот им (mysql.com) хороший урок - позор бля) сделать более жестким и безопасным
нахрена создавать функцию экранирования если экранирование можно реализовать в функции выборки - одним словом - ГАВНо ЭТОТ ОПЕНСОУРС (не радуйтесь - проприетарзина ни чем не лучше)
Заметь, из нас двоих, аноним, _для_тебя_ стал новостью взлом сервера.
заметь, ломают сайты и на дотнетах, и на жабе.
и для меня это давно не новость ни для одного, ни для другого, ни для третьего.а ваш тезис характеризуется пословицей - обжегшись на молоке, дуть на воду.