Что C++ может сделать, который слишком тверд или грязен на каком-либо другом языке?

ВАЖНО

. Лучший способ предотвратить SQL Injection - использовать подготовленные выражения вместо экранирования , поскольку демонстрирует принятый ответ .

Существуют библиотеки, такие как Aura.Sql и EasyDB , которые позволяют разработчикам легче использовать подготовленные инструкции. Чтобы узнать больше о том, почему подготовленные операторы лучше в останавливать SQL-инъекцию , см. этот mysql_real_escape_string() обход и недавно зафиксированные уязвимости Unicode SQL Injection в WordPress .

Предотвращение впрыска - mysql_real_escape_string ()

У PHP есть специально созданная функция для предотвращения этих атак. Все, что вам нужно сделать, это использовать функцию функции mysql_real_escape_string.

mysql_real_escape_string берет строку, которая будет использоваться в запросе MySQL, и возвращает ту же строку со всеми попытками внедрения SQL безопасно сбежал. В принципе, это заменит эти неприятные кавычки ('), которые пользователь может ввести с помощью заменителя в MySQL, сэкономленная цитата.

ПРИМЕЧАНИЕ: вы должны подключиться к базе данных, чтобы использовать эту функцию!

// Подключение к MySQL

$name_bad = "' OR 1'"; 

$name_bad = mysql_real_escape_string($name_bad);

$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
echo "Escaped Bad Injection: 
" . $query_bad . "
"; $name_evil = "'; DELETE FROM customers WHERE 1 or username = '"; $name_evil = mysql_real_escape_string($name_evil); $query_evil = "SELECT * FROM customers WHERE username = '$name_evil'"; echo "Escaped Evil Injection:
" . $query_evil;

Более подробную информацию вы найдете в MySQL - SQL Injection Prevention .

30
задан Robert Harvey 14 July 2010 в 02:58
поделиться

16 ответов

Я остался с C++, поскольку это - все еще самый высокий работающий язык общего назначения для приложений, которые должны объединить эффективность и сложность. Как пример, я пишу оперативное программное обеспечение моделирования поверхности для карманных устройств для промышленности рассмотрения. Учитывая ограниченные ресурсы, Java, C#, и т.д.... просто не обеспечивают необходимые рабочие характеристики, тогда как более низкие языки уровня как C намного медленнее для разработки в, учитывая более слабые характеристики абстракции. Диапазон уровней абстракции, доступной разработчику C++, огромен в одном экстремальном значении, я могу перегружать арифметические операторы, таким образом, что я могу сказать что-то как MaterialVolume = DesignSurface - GroundSurface, одновременно выполняя много различной "кучи" для управления памятью наиболее эффективно для моего приложения на определенном устройстве. Объедините это с богатством источника в свободном доступе для решения в значительной степени любой типичной проблемы, и у Вас есть один heck мощного языка разработки.

C++ является все еще оптимальным решением для разработки для большинства проблем в большинстве доменов? Вероятно, не, хотя в повышении это может все еще использоваться для большинства из них. Это - все еще лучшее решение для эффективной разработки высокопроизводительных приложений? По моему скромному мнению, без сомнения.

38
ответ дан SmacL 27 November 2019 в 22:53
поделиться

Хорошо, чтобы быть довольно честными, можно сделать примерно что-либо если согласное для записи достаточного количества кода.

Так для ответа на вопрос, нет, нет ничего, что Вы не можете сделать на другом языке, который не может сделать C++. Это, сколько терпения Вы имеете, и Вы готовы посвятить долгие бессонные ночи, чтобы заставить его работать?

существуют вещи, которые обертки C++ облегчают делать (потому что они могут считать заголовочные файлы), как разработка Office. Но снова, это - потому что кто-то записал много кода для "обертывания" его для Вас в RCW или "Обертке вызовов среды выполнения"

РЕДАКТИРОВАНИЕ: Вы также понимаете, что это - загруженный вопрос.

-1
ответ дан Chris 27 November 2019 в 22:53
поделиться

C++ обеспечивает полный контроль над памятью и как результат делать поток намного более предсказуемого выполнения программы. Мало того, что можно сказать точно, в какое время выделения и освобождение памяти происходят, можно определить Вас собственная "куча", иметь несколько "кучи" в различных целях и сказать точно, где в данных оперативной памяти выделяется. Это часто полезно при программировании во встроенных / системах реального времени, таких как игровые консоли, сотовые телефоны, MP3-плееры, и т.д...., который:

  1. имеют строгие верхние пределы памяти, которой легко достигнуть (constrast с ПК, который просто становится медленнее, поскольку у Вас заканчивается физическая память)
  2. , часто не имеют гомогенного расположения памяти. Можно хотеть выделить объекты одного типа в одной части физической памяти и объекты другого типа в другой части.
  3. имеют ограничения программирования в режиме реального времени. Неожиданно вызов сборщика "мусора" не в то время может иметь катастрофические последствия.

AFAIK, C и C++ являются единственной разумной опцией для того, чтобы сделать такого рода вещь.

2
ответ дан user48956 27 November 2019 в 22:53
поделиться

Жесткий контроль над системными ресурсами (особенно память) при предложении мощных механизмов абстракции дополнительно. Единственный язык, который я знаю этого, может близко подойти к C++, в этом отношении Ada.

2
ответ дан Nemanja Trifunovic 27 November 2019 в 22:53
поделиться

Я думаю, что перегрузка оператора является довольно хорошей функцией. Конечно, этим можно очень злоупотребить (как в лямбде Повышения).

3
ответ дан Filip Frącz 27 November 2019 в 22:53
поделиться

C# и Java вынуждают Вас поместить свое 'основное ()' функция в классе. Я нахожу это странным, потому что это растворяет значение класса.

мне, класс является категорией объектов в Вашей проблемной области. Программа не такой объект. Таким образом, никогда не должно быть класса под названием 'Программа' в Вашей программе. Это было бы эквивалентно математическому доказательству с помощью символа для записывания нотами себя - доказательства - вместе с символами, представляющими математические объекты. Это будет просто странно и непоследовательно.

, К счастью, в отличие от C# и Java, C++ позволяет глобальные функции. Это позволяет Вашему основному () функция для существования снаружи. Поэтому C++ предлагает более простое, более последовательное и возможно более истинную реализацию объектно-ориентированная идиома. Следовательно, это - одна вещь, которую может сделать C++, но C# и Java не могут.

5
ответ дан Frederick The Fool 27 November 2019 в 22:53
поделиться

Передающие структуры POD через процессы с минимумом наверху. Другими словами, это позволяет нам легко обрабатывать блобы двоичных данных.

5
ответ дан Agnel Kurian 27 November 2019 в 22:53
поделиться

Технически, я думаю, что нет ни одного, действительно!

я честно не думаю, что существует что-либо, что может сделать C++, который не может Язык D . Неважно, что имеет C++ способности, это всегда более твердо и более грязно, чем D или любой другой язык. Даже простая вещь как объявление класса настолько более тверда и более грязна в C++, чем какой-либо другой язык.

единственная вещь, которую может сделать C++, быть совместимой с миллионами строк кодов, уже записанных в C++.
Это - единственная вещь, которую не может сделать никакой язык кроме C++:)

4
ответ дан hasen 27 November 2019 в 22:53
поделиться

Неограниченный контроль по расположению памяти, выравниванию и доступу, когда Вам нужен он. Если Вы достаточно осторожны, можно записать некоторые очень благоприятные для кэша программы. Для многопроцессорных программ можно также устранить много медленных холмов от механизмов когерентности кэша.

(Хорошо, можно сделать это в C, блоке, и вероятно Фортране также. Но C++ позволяет Вам записать остальную часть Вашей программы в более высоком уровне.)

9
ответ дан Boojum 27 November 2019 в 22:53
поделиться

Шаблон mixins обеспечивает повторное использование, которое я не видел в другом месте. С ними можно создать большой объект с большим поведением, как будто Вы записали все это вручную. Но все эти небольшие аспекты его функциональности могут быть снова использованы, это особенно большое для реализации частей интерфейса (или все это), где Вы реализуете много интерфейсов. Полученный объект является молниеносным, потому что он все встраивается.

Скорость не может иметь значения во многих случаях, но когда Вы пишете компонентное программное обеспечение, и пользователи могут объединить компоненты в не думавшем - сложных способов сделать вещи, скорость встраивания и C++, кажется, позволяет намного более сложным структурам быть созданными.

9
ответ дан Jesse Pepper 27 November 2019 в 22:53
поделиться

Я думаю, что просто собираюсь похвалить C++ за его способность использовать шаблоны, чтобы поймать выражения и выполнить его лениво, когда он необходим. Для тех, которые не знают, то, что это о, здесь , является примером.

12
ответ дан Community 27 November 2019 в 22:53
поделиться

Запишите встроенный ассемблерный код (MMX, SSE, и т.д.).

Детерминированное объектное разрушение. Т.е. реальные деструкторы. Делает руководящие дефицитные ресурсы легче. Допускает RAII.

Более легкий доступ к структурированным двоичным данным. Легче снять регион памяти в качестве структуры, чем проанализировать его и скопировать каждое значение в структуру.

Множественное наследование. Не все может быть сделано с интерфейсами. Иногда Вы хотите наследовать фактическую функциональность также.

18
ответ дан Steve Rowe 27 November 2019 в 22:53
поделиться

Детерминированное объектное разрушение приводит к некоторым великолепным шаблонам разработки. Например, в то время как RAII не является столь же общей техникой как сборка "мусора", он приводит к некоторым впечатляющим возможностям, которые Вы не можете получить с GC.

C++ также уникален в этом, он имеет полный по Тьюрингу препроцессор. Это позволяет Вам предпочитать (поскольку в противоположности задерживают), много задач кода ко времени компиляции вместо времени выполнения. Например, в реальном коде у Вас могло бы быть утверждение (), оператор для тестирования на никогда - происходит. Действительность - то, что это рано или поздно произойдет... и произойдет в 3:00, когда Вы будете на каникулах. Препроцессор C++ утверждает, делает тот же тест во время компиляции. Время компиляции утверждает сбой между 8:00 и 17:00, в то время как Вы сидите перед компьютером, наблюдая сборку кода; время выполнения утверждает сбой в 3:00, когда Вы спите на Гавайях. Довольно легко видеть победу там.

На большинстве языков, стратегические модели сделаны во времени выполнения и выдают исключения в случае несоответствия типов. В C++ стратегии могут быть сделаны во время компиляции через средство препроцессора и могут быть гарантированы безопасные с точки зрения типов.

23
ответ дан Rob 27 November 2019 в 22:53
поделиться

Стрельба в себя в ноге.

Никакой другой язык не предлагает такого творческого массива инструментов. Указатели, множественное наследование, шаблоны, перегрузка оператора и препроцессор.

А замечательно мощный язык, который также обеспечивает богатые возможности для стрельбы ноги.

Редактирование: Я приношу извинения, если моя хромая попытка юмора оскорбила некоторых. Я полагаю, что C++ самый мощный язык, который я когда-либо использовал - со способностями кодировать на уровне ассемблера, когда желаемый, и на высоком уровне абстракции, когда желаемый. C++ был моим основным языком с начала 90-х.

Мой ответ был основан на годах опыта стрельбы в меня в ноге. По крайней мере, C++ позволяет мне делать так изящно.

30
ответ дан Kluge 27 November 2019 в 22:53
поделиться

RAII / детерминированное завершение . Нет, сборка "мусора" не так же, как хорошая , когда Вы имеете дело с недостаточным, совместно используемым ресурсом.

Беспрепятственный доступ к API ОС .

52
ответ дан Shog9 27 November 2019 в 22:53
поделиться

Вероятно, это не будет популярным ответом, но я думаю, что то, что отличает C ++, - это его возможности времени компиляции, например, шаблоны и #define. Вы можете выполнять всевозможные манипуляции с текстом в своей программе, используя эти функции, от многих из которых отказались в более поздних языках во имя простоты. Для меня это намного важнее, чем любая низкоуровневая игра с битами, которая якобы проще или быстрее в C ++.

C #, например, не имеет реальной возможности макроса. Вы не можете # включить другой файл непосредственно в источник или использовать #define для управления программой как текстом. Подумайте о каждом случае, когда вам приходилось механически вводить повторяющийся код и вы знали, что есть лучший способ. Возможно, вы даже написали программу для генерации кода для вас. Что ж, препроцессор C ++ автоматизирует все эти вещи.

" которые неизбежно более раздуты и многослойны, чем подход C ++. Например, я видел, как программисты обходили отсутствие #include несколькими раздутыми способами: динамически связываясь с внешними сборками, переопределяя константы в нескольких местах (один файл на проект) или выбирая константы из базы данных и т. Д.

Как однажды сказала г-жа Крэбэппл из The Simpson's, это «довольно глупо, Милхаус».

С точки зрения информатики, эти функции C ++ во время компиляции позволяют использовать такие вещи, как передача параметров по имени, что известно быть более мощным, чем вызов по значению и вызов по ссылке.

Опять же, это, возможно, не самый популярный ответ - например, любой вводный текст C ++ предупредит вас об использовании #define. Но, работая с множеством языков на протяжении многих лет, и учитывая теорию, лежащую в основе всего этого, я думаю, что многие люди дают плохие советы. Это особенно характерно для разбавленного подполя, известного как «ИТ».

6
ответ дан 27 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: