При отображении содержания от базы данных на странице можно использовать HttpServerUtility. HtmlEncode для кодирования вывода для предотвращения Перекрестных сценариев сайта (XSS) нападения.
Реализация TCP обычно завершает трехстороннее рукопожатие TCP еще до того, как пользовательский процесс получит доступ к соединению, а функция accept ()
просто отключает следующее соединение. очередь. Так что делать вид, что сервер не работает, уже поздно. Это работает так же для обычных данных TCP; реализация TCP не ждет, пока приложение действительно recv ()
отправит данные, прежде чем TCP ACK будет отправлен. Это предохраняет другую сторону от ненужной повторной передачи пакетов, которые были приняты правильно, и позволяет пропускной способности оставаться на высоком уровне, даже когда приложение «зависает» от других вещей. В случае новых подключений (пакетов SYN) это также позволяет ядру защитить себя (и приложение) от атак SYN-флуда.
Хотя это и не переносимо, Многие платформы предоставляют своего рода возможности межсетевого экрана, которые позволяют фильтровать входящие соединения на основе IP-адреса / порта. Однако это обычно настраивается в масштабе всей системы, а не отдельным приложением.
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
.
В окнах : посмотрите 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.
Однако вы можете просто закрыть сокет после принятия, если предварительное условие ложно:)
концепция отказа от подключения на основе IP-адреса не будет работать, если вы используете NAT.