$ PHP _SERVER ['HTTP_HOST'] по сравнению с $ _SERVER ['SERVER_NAME'], я понимаю страницы справочника правильно?

На самом деле вы используете __declspec(dllexport) ? Моя догадка - нет - без этой декларации эта функция не будет экспортироваться DLL (или, другими словами, программы, загружающие DLL, не будут иметь доступ к функциям без этой декларации).

Кроме того, попробуйте используя Dependency Walker , чтобы увидеть, какие именно функции вашей библиотеки DLL доступны.


Тот факт, что __declspec(dllexport) не используется в объявлениях функций, в порядке - большая часть время, оно будет использоваться только один раз в одном файле заголовка, например

#ifdef MAKING_DLL
#define FOO_API __declspec(dllexport)
#else
#define FOO_API
#endif

. Таким образом, если у вас есть #define MAKING_DLL до этого раздела, все функции, объявленные как FOO_API int BakeACake(), будут экспортированы на основе определения MAKING_DLL. Возможно, проект ожидал, что MAKING_DLL (или его эквивалент) будет определен в командной строке в зависимости от типа проекта (например, /DMAKING_DLL, или вам может даже понадобиться определить FOO_API как /DFOO_API=__declspec(dllexport).

Пустая верхняя правая секция в Dependency Walker просто означает, что ваша программа не связывается с соответствующим DLL-файлом DLL. Это нормально, это просто означает, что вы используете LoadLibrary или LoadLibraryEx для доступа к функциям в DLL.

Другой довольно вероятный сценарий (основанный на том, что измененные имена разные) заключается в том, что программа была построена с использованием другой версии Visual Studio, чем 2008, которую вы использовали для создания DLL В отличие от обычного C нет стандартного двоичного интерфейса для C ++, а это значит, что вам нужно использовать тот же компилятор для сборки программы и DLL, когда вы используете классы C ++ в DLL. Если вы можете, попробуйте перестроить программу в VS2008 , или попробуйте перестроить DLL в той же версии VS, что и при создании программы.

153
задан Jeff 29 June 2018 в 20:48
поделиться

4 ответа

Наверное, это первая мысль каждого. Но это немного сложнее. См. Статью Криса Шифлетта SERVER_NAME в сравнении с HTTP_HOST .

Кажется, серебряной пули нет. Только когда вы заставите Apache использовать каноническое имя , вы всегда получите правильное имя сервера с помощью SERVER_NAME .

Так что вы либо соглашаетесь с этим, либо проверяете имя хоста по белый список:

$allowed_hosts = array('foo.example.com', 'bar.example.com');
if (!isset($_SERVER['HTTP_HOST']) || !in_array($_SERVER['HTTP_HOST'], $allowed_hosts)) {
    header($_SERVER['SERVER_PROTOCOL'].' 400 Bad Request');
    exit;
}
141
ответ дан 23 November 2019 в 22:06
поделиться

Основное различие между ними состоит в том, что $ _ SERVER ['SERVER_NAME'] - это переменная, управляемая сервером, а $ _ SERVER ['HTTP_HOST'] - это значение, управляемое пользователем.

Практическое правило - никогда не доверять значениям пользователя, поэтому $ _ SERVER ['SERVER_NAME'] - лучший выбор.

Как указал Гамбо. , Apache создаст SERVER_NAME из значений, заданных пользователем, если вы не установите UseCanonicalName на .

Изменить: С учетом всего сказанного, если сайт использует виртуальный хост на основе имени, HTTP-хост заголовок - единственный способ попасть на сайты, не являющиеся сайтом по умолчанию.

8
ответ дан 23 November 2019 в 22:06
поделиться

Используйте либо. Оба они одинаково (не) безопасны, так как во многих случаях SERVER_NAME просто заполняется из HTTP_HOST. Обычно я использую HTTP_HOST, чтобы пользователь оставался на том же имени хоста, с которого он начал. Например, если у меня один и тот же сайт в домене .com и .org, я не хочу отправлять кого-то с .org на .com, особенно если у них могут быть токены входа на .org, которые они потеряют при отправке на. другой домен.

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

Причина в том, что если вы разрешаете доступ к своему сайту под любым старым именем, вы подвергаетесь атакам повторного связывания DNS (когда имя хоста другого сайта указывает на ваш IP-адрес, пользователь обращается к вашему сайту с именем хоста злоумышленника, затем имя хоста перемещается на IP-адрес злоумышленника, забирая с собой ваши файлы cookie / auth) и захват поисковой системы (когда злоумышленник указывает свое собственное имя хоста на вашем сайте и пытается заставить поисковые системы рассматривать его как `` лучшее '' основное имя хоста).

По-видимому, в основном речь идет о $ _SERVER ['PHP_SELF'] и о том, почему вы не должны использовать его в атрибуте действия формы без надлежащего экранирования для предотвращения атак XSS.

Пфф. Что ж, вы не должны использовать ничего в любой атрибут без экранирования с помощью htmlspecialchars ($ string,

25
ответ дан 23 November 2019 в 22:06
поделиться

Я не уверен и не очень доверяю $_SERVER['HTTP_HOST'], потому что это зависит от заголовка от клиента. Другим способом, если домен, запрашиваемый клиентом, не является моим, он не попадет на мой сайт, потому что DNS и протокол TCP/IP направляют его в нужное место. Однако я не знаю, можно ли взломать DNS, сеть или даже сервер Apache. Чтобы быть в безопасности, я определяю имя хоста в окружении и сравниваю его с $_SERVER['HTTP_HOST'].

Добавьте SetEnv MyHost domain.com в корневой файл .htaccess и добавьте этот код в Common.php

if (getenv('MyHost')!=$_SERVER['HTTP_HOST']) {
  header($_SERVER['SERVER_PROTOCOL'].' 400 Bad Request');
  exit();
}

Я включаю этот файл Common.php в каждую php страницу. Эта страница делает все необходимое для каждого запроса, например session_start(), изменяет куки сессии и отклоняет, если метод post пришел с другого домена.

3
ответ дан 23 November 2019 в 22:06
поделиться
Другие вопросы по тегам:

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