Когда можно опустить расширение файла в #include директиве?

ВАЖНО

. Лучший способ предотвратить 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 .

44
задан Brian Tompsett - 汤莱恩 3 June 2016 в 22:14
поделиться

7 ответов

Заголовки стандарта C++ не имеют суффикса ".h". Я полагаю, что причина состоит в том, что были многие, различные предварительные стандартные реализации, которые повредит стандарт. Таким образом вместо того, чтобы требовать, чтобы поставщики изменили свой выход "iostream.h" (например), заголовок, чтобы быть совместимыми стандартами (который повредил бы код их существующего пользователя), комитет по стандартам решил, что они отбросят суффикс (который, я полагаю не тогда, что существующая реализация уже сделала).

Тот путь, существующие, нестандартные программы продолжили бы работать, пользуясь нестандартными библиотеками поставщика. Когда пользователь хотел сделать их стандарты программ совместимыми, один из шагов, которые они сделают, должен измениться" #include" директива для отбрасывания суффикса ".h".

Так

#include <iostream>     // include the standard library version
#include <iostream.h>   // include a vendor specific version (which by 
                        //      now might well be the same)

, Поскольку другие ответы упомянули, писатели нестандартных библиотек могут выбрать или соглашение о присвоении имен, но я думал бы, что они захотят продолжить использовать ".h" или ".hpp" (поскольку Повышение сделало) по паре причин:

  1. , если & когда библиотека будет стандартизирована, стандартная версия автоматически не переопределит предыдущее, нестандартное одно (порождение поврежденного пользовательского кода, по всей вероятности)
  2. , это, кажется, соглашение (более или менее), что заголовки без суффикса являются стандартными библиотеками, и те с суффиксом (кроме старых заголовков C) нестандартны.

Примечание, что подобная проблема произошла, когда комитет пошел для добавления хеша, отображается на STL - они нашли, что уже существуют много (отличающиеся) hash_map реализации, которые существуют, таким образом, вместо предложения стандартного, которое повреждает много материала там сегодня, они называют стандартную реализацию" unordered_map". Пространства имен, как предполагалось, помогли предотвратить этот тип перехода через обручи, но это, казалось, не работало достаточно хорошо (или не использовалось достаточно хорошо), чтобы позволить им использовать более естественное имя, не повреждая много кода.

Примечание, что для заголовков 'C', C++ позволяет Вам включать или <cxxxxxx> или <xxxxxx.h> вариант. Тот, который запускается с 'c' и не имеет никакого суффикса ".h", поместил их объявления в std пространство имен (и возможно глобальное пространство имен), те с суффиксом ".h" ставят имена в глобальном пространстве имен (некоторые компиляторы также ставят имена в std пространство имен - неясно мне, если это стандартно совместимый, хотя я не вижу вреда).

63
ответ дан Alexis Wilke 26 November 2019 в 21:52
поделиться

Если файл называют tuple тогда, Вам нужно к #include <tuple>, если он назвал tuple.h тогда, Вам нужно к #include <tuple.h>

, Это настолько просто. Вы не опускаете расширения.

18
ответ дан Ferruccio 26 November 2019 в 21:52
поделиться

Это включает файл, который просто называют "кортежем" - сам файл испытывает недостаток в расширении.

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

15
ответ дан Crashworks 26 November 2019 в 21:52
поделиться

Нет ничего специального продолжения. Файл просто называют tuple.

причина этого..., что стандартные заголовки библиотеки не имеют никакого расширения файла, из-за namespace с.

Пространства имен были добавлены к стандарту C++ поздно в игре с C++ 98 стандартов, включая std пространство имен, в котором находятся все стандартные объекты библиотеки.

, Когда стандартная библиотека была перемещена в std пространство имен, которое означало, что весь существующий код C++ повредится, так как все это ожидало, что библиотека будет в глобальном пространстве имен. Решение состояло в том, чтобы уехать, старое "делает" одни только заголовочные файлы и обеспечивает namespaced библиотеку в файлах, которые не имеют никакого расширения.

Таким образом, старый код, который был бы #include<iosteam.h>, мог ожидать глобальное cout, в то время как новый код мог #include<iostream> и ожидать std::cout.

7
ответ дан Drew Dormann 26 November 2019 в 21:52
поделиться

Мое понимание было то, что #include кортеж "укажет" на tuple.h.

Проверяют это: iostream по сравнению с iostream.h

4
ответ дан nmiller 26 November 2019 в 21:52
поделиться

В дополнительном к прекрасным ответам, уже отправленным, нужно отметить, что стандарт C++ не требует, чтобы направляющий "#include <iostream>" считал файл, названный "iostream", или даже "iostream.h". Это можно было назвать "fuzzball". Или, никакой соответствующий файл не может существовать и определения быть встроенным в компилятор и активированным включать директивой.

4
ответ дан Darron 26 November 2019 в 21:52
поделиться

Ребята,

Я думаю, что дело в следующем: #include всегда pre pends / lib / include в путь поиска (.h - это infrerred), тогда как #include ищет просто -I .

Обратите внимание, что я могу ошибаться ... Я так думаю, что это работает (в Forte CC на Solaris).

-4
ответ дан 26 November 2019 в 21:52
поделиться
Другие вопросы по тегам:

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