Там какие-либо макросы должны определить, компилируется ли мой код в Windows? [дубликат]

Использование PDO и MYSQLi является хорошей практикой для предотвращения инъекций SQL, но если вы действительно хотите работать с функциями и запросами MySQL, было бы лучше использовать

mysql_real_escape_string

$unsafe_variable = mysql_real_escape_string($_POST['user_input']);

Есть больше возможностей для предотвращения этого: например, идентификация - если ввод представляет собой строку, число, символ или массив, есть так много встроенных функций для обнаружения этого. Кроме того, было бы лучше использовать эти функции для проверки входных данных.

is_string

$unsafe_variable = (is_string($_POST['user_input']) ? $_POST['user_input'] : '');

is_numeric

$unsafe_variable = (is_numeric($_POST['user_input']) ? $_POST['user_input'] : '');

И гораздо лучше использовать эти функции для проверки входных данных с помощью mysql_real_escape_string.

36
задан Brian Tompsett - 汤莱恩 3 February 2016 в 20:40
поделиться

10 ответов

[Редактирование: Я предполагаю, что Вы хотите использовать макросы времени компиляции для определения, какая среда Вы идете. Возможно, Вы хотите определить, работаете ли Вы на Вине в соответствии с Linux или чем-то вместо Windows, но в целом, Ваш компилятор предназначается для определенной среды, и это - или Windows (DOS), или это не, но это редко (никогда?) оба.]

Некоторые компиляторы предлагают макросы для указания на среду сборки Windows. Но они будут варьироваться от компилятора до компилятора, и даже на том же компиляторе в Windows, если целевая среда будет не исключительно окна. Обычно это __WIN32__, но не всегда.

#if defined (__WIN32__)
  // Windows stuff
#endif

Иногда это может быть _WIN32, __CYGWIN32__, или возможно просто индикатор (_MSC_VER).

компилятора, Если Вы знаете среду, Вы будете создавать в (из make-файла) тогда, можно обычно передавать в #define на командной строке, как" g++ -D __WIN32__ yourfile.c".

Немного больше информации здесь

34
ответ дан phord 27 November 2019 в 05:25
поделиться

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

  • Сборка : Это - среда, в которой компилируется программа.
  • Хост : Это - среда, в которой запускается программа.
  • Цель : В случае инструментов генерации кода (таких как компиляторы), это - то, куда сгенерированный код будет работать.

, Если Вы , кросс-компиляция , среда сборки и серверная среда может полностью отличаться (это распространено при создавании встраиваемых приложений, но не очень распространенное при создании приложений рабочего стола/сервера), и Вы обычно не можете работать, скомпилированный двоичный файл в системе раньше компилировал его. Иначе серверная среда должна быть совместима со средой сборки: например, создавая приложение на XP, который будет работать на Vista.

макросы препроцессора C не могут использоваться, чтобы сказать Вам детали хост-системы (т.е. на чем Вы работаете); они могут только сказать Вам, для чего был скомпилирован код. В случае окон два самых важных макросов:

  • _WIN32 показывает, что API Win32 доступен. Это делает не , говорят Вам, какой компилятор Вы используете, на самом деле _WIN32 определяется и при использовании GCC Cygwin и GCC MinGW. Так, не используйте _WIN32, чтобы выяснить, компилируетесь ли Вы с Visual Studio.
  • _MSC_VER говорит Вам, что Вы программа компилируетесь с Microsoft Visual C/C ++. Ну, почти. _MSC_VER также определены при использовании компилятора C++ Intel, который предназначается, чтобы быть общедоступной заменой для Visual C++.

существует набор других макросов, описанных в документации Visual Studio.

, Если Вы хотите знать, какую точную версию Windows Вы используете, необходимо будет использовать функции времени выполнения, такие как GetVersion () (как описано в других ответах).

Вы могли бы получить более определенные ответы, если бы Вы сказали нам точно, на что Вы хотите проверить.

20
ответ дан JesperE 27 November 2019 в 05:25
поделиться
% touch foo.C ; g++ -dM -E foo.C

сделает хорошее задание списка всех макросов (#define), автоволшебно определенный для Вас Вашим [машина, конкретная] g ++ компилятор.

могло бы быть что-то подобное для компиляторов Microsoft...

15
ответ дан Mr.Ree 27 November 2019 в 05:25
поделиться

При выполнении MS Windows предназначенный код, можно назвать GetVersion () или GetVersionEx () для большего количества информации, и определить вариант Windows, на котором Вы работаете.

Для большего количества информации определяют объем информации о MSDN

http://msdn.microsoft.com/en-us/library/ms724451 (По сравнению с 85) .aspx

4
ответ дан user51241 27 November 2019 в 05:25
поделиться

Ссылки, упомянутые до сих пор, указывают на информацию во время компиляции. Можно установить флаги в тех сегментах кода во время компиляции.

Однако я думаю, что Вы спрашиваете, больше вроде, "Под какой версией окон я работаю? "не "Я компилируюсь для выполнения под окнами?" Я надеюсь, что это - корректное предположение.

Под C#, это относительно просто. Можно сослаться на Систему. Среда. OSVersion тогда смотрят под "Платформой".

Однако Вы спрашиваете о C++. Какой компилятор Вы используете? Это имеет большое значение относительно того, как Вы проверяете на версию операционной системы, поскольку нет никакого единственного стандарта для того, чтобы получить эту информацию (что я нашел).

Под Visual C++, используйте Google для нахождения информации о GetVersion/GetVersionEx. Оба дадут Вам структуры, которые содержат информацию о текущей версии Windows, под которым запускает программа.

3
ответ дан Jerry 27 November 2019 в 05:25
поделиться

MSVC ++ компилятор (не windows.h) определяет _WIN32 для весь сборки, таким образом, это - более безопасный макрос для проверки. Компилятор MinGW gcc делает также. Любой Win32 предназначения среды кросс-компиляции должен устанавливать это также.

3
ответ дан j_random_hacker 27 November 2019 в 05:25
поделиться

На самом деле я пошел бы со Средой. getenv () является стандартной библиотечной функцией и так является, вероятно, единственным потенциально портативным способом сделать это. Прием выясняет, какие переменные уникальны для всех Ose. Windows имеет ComSpec, appdata, Windir, корневой каталог и systemdrive, который должен быть установлен. Вы могли также strstr переменная пути для WINDOWS или WINNT, но это не могло бы быть точно. Я не эксперт по оболочке/Солярису/MacOS Linux, таким образом, кто-то еще мог бы быть в состоянии сказать Вам, какие "стандартные" переменные среды существуют в тех Ose. CygWin может вызвать Вас некоторые проблемы, также.

2
ответ дан jmucchiello 27 November 2019 в 05:25
поделиться

Это, вероятно, зависело бы от компилятора, который Вы используете, но попытка:

#ifdef WIN32
...
#endif
1
ответ дан Ates Goral 27 November 2019 в 05:25
поделиться

Макросы, такие как те упомянутые выше скажут Вам, если Вы будете программировать, был , скомпилировал на (или скорее для ) машина Windows, не , если это выполнение на машине окон.

, Если Вы пишете что-то, что является полностью агностиком платформы (т.е. это только обрабатывает открытие / читающий / обрабатывающий / пишущий), потоки файла.. необходимо будет сделать некоторый тест как открытый файл, который должен существовать, если компьютер запускает Windows. Если Ваша программа использует только стандарт stdio, математику, и т.д. это будет иметь место.

Иначе, если Ваш код содержит Windows определенные системные вызовы, его просто не попытка работать на какой-либо другой платформе.

Вы могли записать некоторый макрос как:

#define RUNNING_ON_WINDOWS ( ... some test )

Просто не используют его для условной компиляции, т.е.:

if (RUNNING_ON_WINDOWS) {
  ... 
} else 
   printf("Windows Required\n");
1
ответ дан Tim Post 27 November 2019 в 05:25
поделиться

Эти три строки помогут вам в обнаружении, сначала мы или большинство предопределенных оконных подсказок вместе в одно определение макроса OS_WIN:

#if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__)
#define OS_WIN
#endif

Затем вы можете проверить это с помощью препроцессора ifdef:

#ifdef OS_WIN
//Windows specific stuff
#else
//Normal stuff
#endif
8
ответ дан 27 November 2019 в 05:25
поделиться