Ситуация тривиальная — есть наша функция, скажем BuildAndInvokeQuery. Эта функция принимает некоторое кол-во параметров и формирует из них строку, которотую отдает другой функции, скажем InvokeQuery.
Т.е все происходит где-то так:
int BuildAndInvokeQuery( ... )
{
char szQueryParam[ ХХХ ] = {0};
// здесь идет формирование szQueryParamreturn InvokeQuery( szQueryParam );
}
Думаю сталкивались не раз. Что касается формирования szQueryParam — тут есть несколько вариантов:
1. Функции типа strcat, strcpy, sprintf и т.д. Т.е. размер буффера не учитывается
2. Функции типа strncat, strncpy, snprintf и т.д. Т.е. размер буффера уже учитывается
Вопрос в том — какой бы вы вариант выбрали ( используете ) и почему.
Внимание!!! Убедительная просьба дотнетчикам не предлагать дотнет. Это тема отдельного обсуждения. Так же убедительная просьба не предлагать использование классов типа CString или string. Все это я знаю, часть этого использую, но интересует именно данная ситуация.
Здравствуйте, AlexLion, Вы писали:
AL>Внимание!!! Убедительная просьба дотнетчикам не предлагать дотнет. Это тема отдельного обсуждения. Так же убедительная просьба не предлагать использование классов типа CString или string. Все это я знаю, часть этого использую, но интересует именно данная ситуация.
Ну раз .NET не предлагать предложу Java.
Шутка.
А если серьезно то вариант номер 2 однозначно. Иначе в лучшем случае заколебешься ловить плавающею ошибку высшего порядка. В худшем злой хакер взломает программу и утащит что-нибудь ценное.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, AlexLion, Вы писали:
AL>Думаю сталкивались не раз. Что касается формирования szQueryParam — тут есть несколько вариантов: AL>1. Функции типа strcat, strcpy, sprintf и т.д. Т.е. размер буффера не учитывается AL>2. Функции типа strncat, strncpy, snprintf и т.д. Т.е. размер буффера уже учитывается
AL>Вопрос в том — какой бы вы вариант выбрали ( используете ) и почему.
Всё зависит от конкретных условий. В одних случаях можно безопасно пользоваться strcpy и иже с ними, в других — нельзя.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Вариант # 3 — использовать классы для работы со строками, а не доисторические жутики вроде strxxx и scanf. Если же выбор только из "n" и не "n", то конечо "n". В VC последних версий вообще не "n" функции помечены как "запрещенные".
AL>Внимание!!! Убедительная просьба дотнетчикам не предлагать дотнет. Это тема отдельного обсуждения. Так же убедительная просьба не предлагать использование классов типа CString или string. Все это я знаю, часть этого использую, но интересует именно данная ситуация.
Неиспользовать классы строк — это глупость. Ну, да раз ни дотнет, ни классы, то пиши на Ди.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Вариант # 3 — использовать классы для работы со строками, а не доисторические жутики вроде strxxx и scanf. Если же выбор только из "n" и не "n", то конечо "n". В VC последних версий вообще не "n" функции помечены как "запрещенные".
Copy a string. These functions are deprecated because more secure versions are available
Это очередная параноя на почве дырявой безопасности в виндах. Эти наивные люди думают, что если запретить стандартную(!) функцию strcpy, то безопасность сразу повысится. Душит смех.
- Ну и мудаки!
— Что значит "нуймудаки"? — неожиданно заинтересовался Чарли
— Идеалисты, романтики.
(С. Довлатов, "Невидимая газета")
VD>Неиспользовать классы строк — это глупость. Ну, да раз ни дотнет, ни классы, то пиши на Ди.
А может у него голый Си?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, AlexLion, Вы писали:
AL>Думаю сталкивались не раз. Что касается формирования szQueryParam — тут есть несколько вариантов: AL>1. Функции типа strcat, strcpy, sprintf и т.д. Т.е. размер буффера не учитывается AL>2. Функции типа strncat, strncpy, snprintf и т.д. Т.е. размер буффера уже учитывается
AL>Вопрос в том — какой бы вы вариант выбрали ( используете ) и почему.
А чего тут думать? Если нет опасности переполнения буфера (например, все аргументы — целочисленные значения с ограниченным диапазоном), то можно и strcpy. Если же есть хоть малейшая опасность затирания стэка, то длину конечно же надо контролировать. Иначе будешь сам себе злобным партизаном.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, McSeem2, Вы писали:
MS>Это очередная параноя на почве дырявой безопасности в виндах. Эти наивные люди думают, что если запретить стандартную(!) функцию strcpy, то безопасность сразу повысится. Душит смех.
Это очередная глупось которую я слышу на этом форуме. Ну, да не прывыкать. Это похоже стиль жизни... с граблями на перевес.
MS>А может у него голый Си?
Ага. Он запросы (InvokeQuery) на С лепит. Это на С++ то полный идиотизм. А на С просто какая-то параноя. Неужели своего своего времени не залго? Думаю, очередная погоня за производительностью... экономяцая несколько микросекунд между полесекундными вызовами к БД.
Ну, и даже если код на С, то нет особых проблем сделать безопасный и удобный АПИ.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Вариант # 3 — использовать классы для работы со строками, а не доисторические жутики вроде strxxx и scanf. Если же выбор только из "n" и не "n", то конечо "n". В VC последних версий вообще не "n" функции помечены как "запрещенные".
Запрещённые или deprecated?
<< Под музыку: Аквариум — Стаканы >>
<< При помощи Януса: 1.2.0 alpha rev. 643 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
MS>>Это очередная параноя на почве дырявой безопасности в виндах. Эти наивные люди думают, что если запретить стандартную(!) функцию strcpy, то безопасность сразу повысится. Душит смех.
VD>Это очередная глупось которую я слышу на этом форуме. Ну, да не прывыкать. Это похоже стиль жизни... с граблями на перевес.
Понимаешь ли, дело совсем не в этом. Было бы понятно и вполне разумно, если бы они написали что-то типа
"Эти функции могут представлять потенциальную опасность и не рекомендуются к использованию в среде Windows. В случаях, когда Ваша программа не является многоплатформенной, настоятельно рекомендуется использовать следующие функции взамен: ..."
Но объявлять стандартные функции deprecated (какие бы они ни были) является самоуверенной наглостью — типа, нам стандарт не указ, мы его отменяем. В приличном обществе за такое — канделябром.
Пусть своим бездарям кумарам раджешам запрещают, а я уж сам решу что мне использовать, а что — нет.
В качестве самоиронии:
— Меня! Боевого муравья! Копытом в грудь! И кто?! — бычьё!!!
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, AlexLion, Вы писали:
AL>Внимание!!! Убедительная просьба дотнетчикам не предлагать дотнет. Это тема отдельного обсуждения. Так же убедительная просьба не предлагать использование классов типа CString или string. Все это я знаю, часть этого использую, но интересует именно данная ситуация.
Это не отдельная тема. Это та же тема — использование строк. Поэтому в случае если нет противопоказаний, лучший вариант — std::string. В противном случае — уже по обстоятельствам. Можно легко определить и свой набор функций, удобных как и strcpy и в то же время безопасных.
Здравствуйте, McSeem2, Вы писали:
MS>Это очередная параноя на почве дырявой безопасности в виндах. Эти наивные люди думают, что если запретить стандартную(!) функцию strcpy, то безопасность сразу повысится. Душит смех.
Это не безопасность виндов. Это безопасность самой программы. К безопасности самой Windows — это имеет мало отношений.
Во-первых — довольно просто можно отключить declspec deprecated (если у тебя есть лазерный меч и сила на твоей стороне то джедаям закон не писан — твори что хочу, только не говори потом что тебя не предупреждали).
Ну а во-вторых — strncpy не менее стандартная чем strcpy. И очччень ненамного медленне работает. И в 99.99% случаев проще забыть о существовании strcpy. То же самое касается sprintf. Я уж не говорю о "взрослых" C++ строках типа std::string, CString и иже с ними.
Здравствуйте, AlexLion, Вы писали:
AL>Всем привет!
AL>Ситуация тривиальная — есть наша функция, скажем BuildAndInvokeQuery. Эта функция принимает некоторое кол-во параметров и формирует из них строку, которотую отдает другой функции, скажем InvokeQuery. AL>Т.е все происходит где-то так:
AL>
AL>int BuildAndInvokeQuery( ... )
AL>{
AL> char szQueryParam[ ХХХ ] = {0};
AL> // здесь идет формирование szQueryParam
AL> return InvokeQuery( szQueryParam );
AL>}
AL>
AL>Думаю сталкивались не раз. Что касается формирования szQueryParam — тут есть несколько вариантов: AL>1. Функции типа strcat, strcpy, sprintf и т.д. Т.е. размер буффера не учитывается AL>2. Функции типа strncat, strncpy, snprintf и т.д. Т.е. размер буффера уже учитывается
AL>Вопрос в том — какой бы вы вариант выбрали ( используете ) и почему.
Тебе нужен in memory stream.
Например, ostrstream.
char szQueryParam[ ХХХ ];
std::ostrstream out(szQueryParam,XXX);
out << "My cool string number " << i << ends ;
Здравствуйте, McSeem2, Вы писали:
MS>Здравствуйте, VladD2, Вы писали:
VD>>Вариант # 3 — использовать классы для работы со строками, а не доисторические жутики вроде strxxx и scanf. Если же выбор только из "n" и не "n", то конечо "n". В VC последних версий вообще не "n" функции помечены как "запрещенные".
MS>Это очередная параноя на почве дырявой безопасности в виндах. Эти наивные люди думают, что если запретить стандартную(!) функцию strcpy, то безопасность сразу повысится. Душит смех.
Винда здесь не причем, это проблема любой системы. Использование функций типа strcpy и sprintf (т.е. без n) может привести к переполнению буфера.
Большенство атак ниспользуют именно эту уязвимость. Проблемы переполнения буфера не решена ни в одной системе и в общем случае их врят ли можно решить. Частично FreeBSD с этим борится рандомизацией стека, но это далеко не всегда помогает.
VD>>Неиспользовать классы строк — это глупость. Ну, да раз ни дотнет, ни классы, то пиши на Ди.
MS>А может у него голый Си?
Здравствуйте, dimon0981, Вы писали:
D>Винда здесь не причем, это проблема любой системы. Использование функций типа strcpy и sprintf (т.е. без n) может привести к переполнению буфера. D>Большенство атак ниспользуют именно эту уязвимость. Проблемы переполнения буфера не решена ни в одной системе и в общем случае их врят ли можно решить. Частично FreeBSD с этим борится рандомизацией стека, но это далеко не всегда помогает.
Можно. Только ОС должна быть управляемая. Например Singularity очень близка к идеалу. Там таких ошибок быть не может по тому что их не может быть в принципе. Ибо в это ОС большей части ядра и всем драйверам запрещено использовать неверфифицируемый код.
Те ошибка может быть только в маленькой части ядра или в кодогенераторе. И то и другое реально отладить ибо это относительно небольшой объем кода.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Можно. Только ОС должна быть управляемая. Например Singularity очень близка к идеалу. Там таких ошибок быть не может по тому что их не может быть в принципе. Ибо в это ОС большей части ядра и всем драйверам запрещено использовать неверфифицируемый код. WH>Те ошибка может быть только в маленькой части ядра или в кодогенераторе. И то и другое реально отладить ибо это относительно небольшой объем кода.
Да? А где эта ОС работает, где ее продают, а? Когда дойдет до практики, идеал может оказаться не столь уж и идеальным. Вот тут некоторые Blackbox хвалят, может он еще лучше?
Здравствуйте, Quintanar, Вы писали:
Q>Да? А где эта ОС работает, где ее продают, а?
Пока это исследовательский проект. Но направление очень верное.
Q>Когда дойдет до практики, идеал может оказаться не столь уж и идеальным. Вот тут некоторые Blackbox хвалят, может он еще лучше?
Ну черная коробка это вобще не ОС. Обероновци толкают голубую бутылку. Но она не выдерживает критики ни по безопасности ни то масштибируемости.
В тоже время анилиз сингулирити откровенно слабых мест в общей концепции не выявил.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Можно. Только ОС должна быть управляемая. Например Singularity очень близка к идеалу. Там таких ошибок быть не может по тому что их не может быть в принципе. Ибо в это ОС большей части ядра и всем драйверам запрещено использовать неверфифицируемый код. WH>Те ошибка может быть только в маленькой части ядра или в кодогенераторе. И то и другое реально отладить ибо это относительно небольшой объем кода.
Проблема, насколько я понимаю, не в коде операционки. Проблема в коде клиентов. Если разрешен неверифицируемый код в клиенте, то safe или unsafe ядро — проблема есть. Если запрещен, то независимо от того, какая операционка, и насколько она сингулярна — проблемы нет.
Здравствуйте, GlebZ, Вы писали:
GZ>Проблема, насколько я понимаю, не в коде операционки. Проблема в коде клиентов. Если разрешен неверифицируемый код в клиенте, то safe или unsafe ядро — проблема есть. Если запрещен, то независимо от того, какая операционка, и насколько она сингулярна — проблемы нет.
На сколько мне извесно самые разрушительные черви ходит именно ерез дырки ОС. Так что верфифицировать нужно все что вобще возможно. Вобщем мое мнение чем меньше unsafe кода тем лучше.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>На сколько мне извесно самые разрушительные черви ходит именно ерез дырки ОС. Так что верфифицировать нужно все что вобще возможно. Вобщем мое мнение чем меньше unsafe кода тем лучше.
Ну хорошо. Вот у нас все-все сэйфее некуда. Что я делаю — беру динамический конртейнер и начинаю память кушать тоннами, пока система не окажется в глубокой свопе. После некоторого количества прецедентов, они объявят существуюшие контейнеры опасными и запретят их. И предложат использовать новые, безопасные — с ограничением по памяти. Прежде, чем создать экземпляр контейнера, необходимо будет послать запрос специальной комиссии с подробным описанием задачи и желаемым максимальным размером контейнера. После одобрения комиссией, данный экземпляр контейнера разрешается к использованию (высылается UUID). Превышение допустимого объема данных трактуется как возможная попытка хакерской атаки, о чем немедленно сообщается комиссии по расследованию информационных преступлений.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.