Чтобы определить, почему код PHP не работает в коде JavaScript , нам нужно понять, что такое клиентский и серверный язык и как они работают.
Серверные языки (PHP и т. д.) : они извлекают записи из баз данных, поддерживают состояние через HTTP-соединение без состояния и выполняют много вещи, требующие безопасности. Они находятся на сервере, эти программы никогда не имеют своего исходного кода для пользователя
[/g16] image attr
blockquote Это означает, HTML интерпретируется и выполняется JavaScript.Хотя с другой стороны Клиентский язык на стороне клиента (например, JavaScript) находится в браузере и запускается в браузере, Сценарии на стороне клиента обычно относятся к классу компьютерных программ в Интернете, которые выполняются на стороне клиента, в веб-браузере пользователя, а не на стороне сервера .
JavaScript отображается пользователю и может быть легко изменен, поэтому для обеспечения безопасности мы не должны полагаться на JavaScript.
Итак, когда вы делаете запрос HTTP на сервере, чем сервер, сначала внимательно читает файл PHP, чтобы узнать, есть ли какие-либо задачи, которые необходимо выполнить, и отправлять ответ на клиентскую сторону и снова, как @deceze сказал * Как только PHP закончил вывод ответа, сценарий заканчивается, и на сервере ничего не произойдет, пока не появится новый запрос HTTP . *
[/g17]
blockquote>Итак, что мне делать, если мне нужно вызвать PHP? Это зависит от того, как вам это нужно: либо перезагружая страницу, либо используя вызов AJAX.
- Вы можете выполнить перезагрузку страницы и отправить запрос HTTP
- вы можете сделать вызов AJAX с помощью JavaScript, и это не требует перезагрузки страницы
Хорошо Чтение:
Согласно сообщению «Виртуальный компьютер Guy » Обнаружение виртуальных машин Microsoft », вы можете использовать WMI для проверки производителя материнской платы. В PowerShell:
(gwmi Win32_BaseBoard).Manufacturer -eq "Microsoft Corporation"
Вот пример одного из способов сделать это. Он работает только с виртуальным ПК Microsoft и VMWare, но это начало: http://www.codeproject.com/KB/system/VmDetect.aspx
Для тестов нижнего уровня я рекомендую посмотреть ScoopyNG [1]. Это сборник известных низкоуровневых, хорошо работающих методов обнаружения vm, хотя они немного устарели.
Если вы действительно хотите полагаться на другие вещи, такие как установленные инструменты (дополнения VM *), это гораздо легче «подделать».
В этом [2] блоге также есть довольно хороший обзор, из материала с низким уровнем asm, проверка определенных DLL, файлов и ключей реестра для проверки.
[1] http://trapkit.de/research/vmm/scoopyng/index.html
[2] http: //securitykitten.github. IO / VM-проверка-и-обнаруживая /
Самый простой способ выяснить, работает ли мое приложение C # на VMware vmware или нет, - это проверить MAC-адрес карты (-ов) NIC. Если это VMware VM, это всегда будет: 00: 50: 56: XX: YY: ZZ
Вы можете перечислить через сетевые карты , как разрешено здесь.
этот код на C ++ обнаруживает такие продукты Vmware, как express, esx, fusion или workstation
// VMWareDetector.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
#include <conio.h>
void CheckVM(void);
int main()
{
CheckVM();
_getch();
return 0;
}
void CheckVM(void)
{
unsigned int a, b;
__try {
__asm {
// save register values on the stack
push eax
push ebx
push ecx
push edx
// perform fingerprint
mov eax, 'VMXh' // VMware magic value (0x564D5868)
mov ecx, 0Ah // special version cmd (0x0a)
mov dx, 'VX' // special VMware I/O port (0x5658)
in eax, dx // special I/O cmd
mov a, ebx // data
mov b, ecx // data (eax gets also modified
// but will not be evaluated)
// restore register values from the stack
pop edx
pop ecx
pop ebx
pop eax
}
}
__except (EXCEPTION_EXECUTE_HANDLER) {}
printf("\n[+] Debug : [ a=%x ; b=%d ]\n\n", a, b);
if (a == 'VMXh') { // is the value equal to the VMware magic value?
printf("Result : VMware detected\nVersion : ");
if (b == 1)
printf("Express\n\n");
else if (b == 2)
printf("ESX\n\n");
else if (b == 3)
printf("GSX\n\n");
else if (b == 4)
printf("Workstation\n\n");
else
printf("unknown version\n\n");
}
else
printf("Result : Not Detected\n\n");
}
Джей Абузи показал решение в powershell. Вот то же самое, что и функция c #:
/// <summary>
/// Detect if this OS runs in a virtual machine
///
/// http://blogs.msdn.com/b/virtual_pc_guy/archive/2005/10/27/484479.aspx
///
/// Microsoft themselves say you can see that by looking at the motherboard via wmi
/// </summary>
/// <returns>false</returns> if it runs on a fysical machine
public bool DetectVirtualMachine()
{
bool result = false;
const string MICROSOFTCORPORATION ="microsoft corporation";
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2","SELECT * FROM Win32_BaseBoard");
foreach (ManagementObject queryObj in searcher.Get())
{
result = queryObj["Manufacturer"].ToString().ToLower() == MICROSOFTCORPORATION.ToLower();
}
return result;
}
catch (ManagementException ex)
{
return result;
}
}
Это то, что я использую:
using (var searcher = new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem"))
{
using (var items = searcher.Get())
{
foreach (var item in items)
{
string manufacturer = item["Manufacturer"].ToString().ToLower();
if ((manufacturer == "microsoft corporation" && item["Model"].ToString().ToUpperInvariant().Contains("VIRTUAL"))
|| manufacturer.Contains("vmware")
|| item["Model"].ToString() == "VirtualBox")
{
return true;
}
}
}
}
return false;
Edit 2014-12-02: Обновлен код, чтобы он больше не обнаруживал Microsoft Surface Pro в качестве виртуальной машины. Спасибо Erik Funkenbusch за это.
Редактировать 2017-06-29: Обновлен код, чтобы он также проверял значение свойства HypervisorPresent
.
Редактировать 2018-02 -05: удалена проверка свойства HypervisorPresent
, так как она неверна. Это свойство может возвращать true, если выполняется на сервере O / S на гипер-V-сервере.
item["Model"].ToString().ToLower().Contains("virtual")
.
– Michael Burr
13 March 2013 в 02:20
IEnumerable<ManagementBaseObjects>
следующим образом: var managementItems = items.OfType<ManagementBaseObject>();
для использования с методами расширения IEnumerable
.
– Ben Clark-Robinson
11 May 2014 в 04:34
Эта функция C обнаружит гостевую ОС VM: (протестировано в Windows, скомпилировано с помощью Visual Studio)
#include <intrin.h>
bool isGuestOSVM()
{
unsigned int cpuInfo[4];
__cpuid((int*)cpuInfo,1);
return ((cpuInfo[2] >> 31) & 1) == 1;
}
cpuid
для определения того, установлен ли бит функции, указывающий, что код работает на гипервизоре. Разумеется, нет требования, чтобы настоящий гипервизор всегда устанавливал этот бит, особенно для гипервизоров программного обеспечения.
– Jeroen Mostert
4 September 2017 в 11:13
public static bool isVirtualMachine()
{
const string MICROSOFTCORPORATION = "microsoft corporation";
const string VMWARE = "vmware";
foreach (var item in new ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
{
string manufacturer = item["Manufacturer"].ToString().ToLower();
// Check the Manufacturer (eg: vmware, inc)
if (manufacturer.Contains(MICROSOFTCORPORATION) || manufacturer.Contains(VMWARE))
{
return true;
}
// Also, check the model (eg: VMware Virtual Platform)
if (item["Model"] != null)
{
string model = item["Model"].ToString().ToLower();
if (model.Contains(MICROSOFTCORPORATION) || model.Contains(VMWARE))
{
return true;
}
}
}
return false;
}