Я решил подобную проблему путем переключения, под которым пользователем работала задача; пользователь по умолчанию не имел прав доступа к сети. Стоящий попытки, по крайней мере. Перепроверка и программные брандмауэры Вы используете, также; я знаю, что Windows Defender дал нам подобные головные боли.
Создайте сценарий, реализующий описанные вами команды, и запустите на нем setuid
, чтобы он мог работать от имени пользователя root, когда кто-либо его вызовет. См. http://en.wikipedia.org/wiki/Setuid для получения дополнительной информации о setuid.
Из PHP вы можете просто вызвать system ('/ bin / setupNewUser');
как обычно, и сценарий будет запущен от имени пользователя root.
Альтернативное решение, ограничивающее возможности внедрения и работающее в системах с отключенным выполнением setuid для скриптов:
Создайте небольшую программу, у которой есть setuid. Пример приведен ниже:
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
if (argc != 2)
{
cout << "Invalid arguments";
return 1;
}
//make sure the argument passed to the script has only [a-z]
for (char* i = argv[1]; *i != '\0'; i++)
{
//check if the current character falls outside an allowed range
if (!(
//Allowed ranges:
// between a and z
('a' <= *i && *i <= 'z')
// between 0 and 9
|| ('0' <= *i && *i <= '9')
// '_' or '-'
|| ('_' == *i)
|| ('-' == *i)
))
{
cout << "Illegal character in username: " << *i << endl;
return 2;
}
}
//append the username
string command = string("/test/setupUser.sh ");
command += string(argv[1]);
//execute the command and return the result transparently
// return system(command.c_str());
// * OR *
// call mkdir directly
}
Вызов программы setuid из php
system('/test/setupUser '.escapeshellarg($username));
По крайней мере, не так, как вы предлагаете - У Apache нет разумной причины делать НИЧЕГО от имени пользователя root.
]
Уровень вопиющего того, что вы предлагаете, должен быть очевиден из-за того, что Apache откажется запускаться от имени root (кроме привязки материнского процесса к порту 80).
Также делать что-либо от имени root с вводом ненадежных пользователей - ужасно Идея и верный способ обнаружить все интересное, что хакер может ввести в поле, заставит вашу систему делать то, чего вы не ожидали.
Если вы действительно хотите сделать это:
4770
( rwsrwx ---
) Это позволит вам пользователь для чтения / записи / и т. д. содержимое каталога и бит SetUID в каталоге заставят пользователя стать владельцем всех файлов (чтобы он мог управлять ими при входе в систему с использованием SCP / SFTP).