Вызов скомпилированного исполняемого файла C ++ из PHP для создания сокета - PullRequest
0 голосов
/ 26 сентября 2019

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

Среда:

  • CentOS7
  • PHP 7.4 (Remi)
  • Apache 2.4.6
  • C ++ 11

Структура файла (немного сокращенно) выглядит следующим образом:

-- Project Title
 |
 |--- bin 
    |- compiled executables
 |--- conf
    |- ini configs
 |--- deps
    |--- cmake
    |--- inih
 |--- doc
 |--- public
    |--- assets
       |--- branding
       |--- symbols
       |--- data 
       |--- lib (php)
          |--- docs
          |--- polyfills
          |--- ui
          |- websocket.php
        |- controller.php
        |- index.php
  |--- src
     |--- db
     |--- doctypes
     |--- sec
     |- main.cpp
     |- request.h
     |- requestsocket.h
  |--- test
     |- unit tests
  |- readme.md
  |- cmakelists.txt

Apache работает как apache: bxwd, и все файлы принадлежат одному и тому же.Исполняемые файлы исполняются владельцем и группой.

Однако вызов исполняемого файла из php - будь то с помощью exec (), shell_exec () или system () - не работает, несмотря на то, что код работает, когдавызывается из командной строки.

Я провел некоторое тестирование, запустив

echo exec("whoami");
var_dump(file_exists('/var/www/html/project/bin/main'));
var_dump(is_executable('/var/www/html/project/bin/main'));

(при этом main является скомпилированным файлом C ++, который существует, который работает при вызове из командной строки).Интересно, что PHP может видеть файл, но is_executable возвращает false."Whoami" возвращает apache, как и ожидалось.

Я копаю в течение нескольких часов.Я испортил httpd.conf, php.ini и попытался вызвать файл несколькими разными способами.Я создал оболочки и привет-миры C ++ файлы, поместил их в тот же каталог, что и скрипт php, и все еще не повезло.

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

exec("/var/www/html/project/bin/main > /dev/null 2>&1");

Что мешает этому работать?

1 Ответ

1 голос
/ 27 сентября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...