Отказ от соединения от хоста

При отображении содержания от базы данных на странице можно использовать HttpServerUtility. HtmlEncode для кодирования вывода для предотвращения Перекрестных сценариев сайта (XSS) нападения.

6
задан Calmarius 12 July 2009 в 18:57
поделиться

4 ответа

Реализация TCP обычно завершает трехстороннее рукопожатие TCP еще до того, как пользовательский процесс получит доступ к соединению, а функция accept () просто отключает следующее соединение. очередь. Так что делать вид, что сервер не работает, уже поздно. Это работает так же для обычных данных TCP; реализация TCP не ждет, пока приложение действительно recv () отправит данные, прежде чем TCP ACK будет отправлен. Это предохраняет другую сторону от ненужной повторной передачи пакетов, которые были приняты правильно, и позволяет пропускной способности оставаться на высоком уровне, даже когда приложение «зависает» от других вещей. В случае новых подключений (пакетов SYN) это также позволяет ядру защитить себя (и приложение) от атак SYN-флуда.

Хотя это и не переносимо, Многие платформы предоставляют своего рода возможности межсетевого экрана, которые позволяют фильтровать входящие соединения на основе IP-адреса / порта. Однако это обычно настраивается в масштабе всей системы, а не отдельным приложением.

14
ответ дан 8 December 2019 в 13:01
поделиться

TCP Wrapper получил очень широкое распространение на UNIX-подобных платформах. Да, соединение проверяется только после accept ; однако, если вы все равно делаете это, вы также можете использовать ту же конфигурацию, что и все остальные.

По сути, ваша программа либо запускается с tcpd , либо модифицирована для использования libwrap напрямую, например:

#include <tcpd.h>
connfd = accept(listenfd, (struct sockaddr *)&addr, &addrlen);
if (!hosts_ctl("my_program", STRING_UNKNOWN, inet_ntoa(addr.sin_addr), STRING_UNKNOWN)) {
    fprintf(stderr, "Client %s connection disallowed\n", inet_ntoa(addr.sin_addr));
    close(connfd);
}

Затем вы настраиваете /etc/hosts.allow и /etc/hosts.deny в соответствии с вашими желаниями, например,

# /etc/hosts.allow
my_program: 127.0.0.1 10. 192.168.

# /etc/hosts.deny
my_program: ALL

Это будет заставляет my_program отклонять все попытки подключения с нелокальных адресов, но может быть изменен, вообще не касаясь my_program .

1
ответ дан 8 December 2019 в 13:01
поделиться

В окнах : посмотрите WSAAccept, может быть, это то, что вам нужно:

SOCKET WSAAccept(
  __in     SOCKET s,
  __out    struct sockaddr *addr,
  __inout  LPINT addrlen,
  __in     LPCONDITIONPROC lpfnCondition,
  __in     DWORD dwCallbackData
);

lpfnCondition - адрес необязательной, определяемой приложением функции условия, которая будет принимать решение о принятии / отклонении на основе информации о вызывающем абоненте, переданной в качестве параметров, и необязательно создавать или присоединяться к группе сокетов путем присвоения соответствующего значения параметру результата g из эта функция. Если этот параметр равен NULL, функция условия не вызывается.

Для решения linux посмотрите на: GNU Common C ++ - класс TCPSocket, он имеет методы onAccept () и reject ().

virtual bool TCPSocket::onAccept    (       const InetHostAddress &      ia,
        tpport_t    port
    )   [inline, protected, virtual]

Метод для вызова в производном классе TCPSocket, который действует как сервер, когда принимается запрос на соединение.

Сервер может реализовать правила протокола, чтобы исключить прием удаленного сокета, вернув false. Для этой цели также можно использовать метод Peek.


Однако вы можете просто закрыть сокет после принятия, если предварительное условие ложно:)

4
ответ дан 8 December 2019 в 13:01
поделиться

концепция отказа от подключения на основе IP-адреса не будет работать, если вы используете NAT.

-1
ответ дан 8 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

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