Как мне обеспечить [ что-нибудь о клиентской программе ] в серверной программе?
Вы не можете.Если ваша модель безопасности требует, чтобы сервер знал, является ли клиент пользователем root, у вас нет защиты.
Давайте рассмотрим одну возможность: ваш сетевой протокол включает уведомлениекак это:
My-Uid-Is: 0
Ваш клиент, совершенно безопасная версия, которую вы написали, может реализовать это уведомление следующим образом:
fprintf(socketFd, "My-Uid-Is: %d\n", getuid()); // send server my identity
Но, мой клиент, тот, без которого я написалваши знания или согласие, будут реализовывать уведомления, как это:
fprintf(socketFd, "My-Uid-Is: 0\n"); // lie to server about my identity
Pop викторина: как ваш сервер может узнать, разговаривает ли он с вашим правдивым клиентом или моим лживым клиентом?Ответ: не может.Фактически, если вы обобщите эту концепцию, вы поймете, что сервер не может полагаться на достоверность (означает ли это достоверность, формат, проверку диапазона и т. Д.) что-нибудь клиент говорит.
В этом конкретном случае использование номера порта источника клиента так же ненадежно, как и любой другой выбор.Да, многим операционным системам требуются привилегии root для привязки к исходным портам с низким номером.Но мой компьютер может не работать под вашей любимой операционной системой.Возможно, я подключаюсь со своего компьютера под управлением собственной ОС, у которой нет этой функции.Помните: вы не можете доверять тому, что говорит клиент.
Существуют методы шифрования с открытым ключом, которые можно использовать, чтобы гарантировать, что программа, с которой вы разговариваете, имеет доступ к определенным секретам.Это, если предположить, что секреты должным образом защищены, может использоваться для гарантии того, что конкретный человек, компьютер или учетная запись сгенерировали запрос.Я позволю кому-то еще обсудить PKI и то, как это может относиться к вашей ситуации.