1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-08 15:02:10 +03:00

OK, might as well finish this... Allow ServerTokens Off

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@808895 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jim Jagielski
2009-08-28 14:31:00 +00:00
parent 0da446e9ea
commit 7fe574e381
7 changed files with 38 additions and 15 deletions

View File

@@ -2,6 +2,10 @@
Changes with Apache 2.3.3 Changes with Apache 2.3.3
*) ServerTokens now accepts 'Off' which disables sending of
Server: header and sets SERVER_SOFTWARE to empty.
[Jim Jagielski]
*) mod_headers: generalise the envclause to support expression *) mod_headers: generalise the envclause to support expression
evaluation with ap_expr parser [Nick Kew] evaluation with ap_expr parser [Nick Kew]

View File

@@ -2873,6 +2873,11 @@ header</description>
information about compiled-in modules.</p> information about compiled-in modules.</p>
<dl> <dl>
<dt><code>ServerTokens Off</code></dt>
<dd>Server sends no <code>Server:</code> header
(and <code>SERVER_SOFTWARE</code> is blank)</dd>
<dt><code>ServerTokens Prod[uctOnly]</code></dt> <dt><code>ServerTokens Prod[uctOnly]</code></dt>
<dd>Server sends (<em>e.g.</em>): <code>Server: <dd>Server sends (<em>e.g.</em>): <code>Server:

View File

@@ -874,6 +874,7 @@ static void basic_http_header(request_rec *r, apr_bucket_brigade *bb,
{ {
char *date; char *date;
const char *server; const char *server;
const char *us = ap_get_server_banner();
header_struct h; header_struct h;
struct iovec vec[4]; struct iovec vec[4];
@@ -930,19 +931,25 @@ static void basic_http_header(request_rec *r, apr_bucket_brigade *bb,
if (server) { if (server) {
form_header_field(&h, "Server", server); form_header_field(&h, "Server", server);
} else { } else {
if (*us) {
form_header_field(&h, "Server", ap_get_server_banner()); form_header_field(&h, "Server", ap_get_server_banner());
} }
} }
}
else { else {
date = apr_palloc(r->pool, APR_RFC822_DATE_LEN); date = apr_palloc(r->pool, APR_RFC822_DATE_LEN);
ap_recent_rfc822_date(date, r->request_time); ap_recent_rfc822_date(date, r->request_time);
form_header_field(&h, "Date", date); form_header_field(&h, "Date", date);
if (*us) {
form_header_field(&h, "Server", ap_get_server_banner()); form_header_field(&h, "Server", ap_get_server_banner());
} }
}
/* unset so we don't send them again */ /* unset so we don't send them again */
apr_table_unset(r->headers_out, "Date"); /* Avoid bogosity */ apr_table_unset(r->headers_out, "Date"); /* Avoid bogosity */
if (*us) {
apr_table_unset(r->headers_out, "Server"); apr_table_unset(r->headers_out, "Server");
}
} }
AP_DECLARE(void) ap_basic_http_header(request_rec *r, apr_bucket_brigade *bb) AP_DECLARE(void) ap_basic_http_header(request_rec *r, apr_bucket_brigade *bb)

View File

@@ -229,7 +229,7 @@ static int proxy_connect_handler(request_rec *r, proxy_worker *worker,
"CONNECT %s HTTP/1.0" CRLF, r->uri); "CONNECT %s HTTP/1.0" CRLF, r->uri);
apr_socket_send(sock, buffer, &nbytes); apr_socket_send(sock, buffer, &nbytes);
nbytes = apr_snprintf(buffer, sizeof(buffer), nbytes = apr_snprintf(buffer, sizeof(buffer),
"Proxy-agent: %s" CRLF CRLF, ap_get_server_banner()); "Proxy-agent: %s" CRLF CRLF, ap_get_server_description());
apr_socket_send(sock, buffer, &nbytes); apr_socket_send(sock, buffer, &nbytes);
} }
else { else {

View File

@@ -1774,7 +1774,7 @@ static int proxy_ftp_handler(request_rec *r, proxy_worker *worker,
apr_rfc822_date(dates, r->request_time); apr_rfc822_date(dates, r->request_time);
apr_table_setn(r->headers_out, "Date", dates); apr_table_setn(r->headers_out, "Date", dates);
apr_table_setn(r->headers_out, "Server", ap_get_server_banner()); apr_table_setn(r->headers_out, "Server", ap_get_server_description());
/* set content-type */ /* set content-type */
if (dirlisting) { if (dirlisting) {

View File

@@ -2684,7 +2684,8 @@ enum server_token_type {
SrvTk_MINIMAL, /* eg: Apache/2.0.41 */ SrvTk_MINIMAL, /* eg: Apache/2.0.41 */
SrvTk_OS, /* eg: Apache/2.0.41 (UNIX) */ SrvTk_OS, /* eg: Apache/2.0.41 (UNIX) */
SrvTk_FULL, /* eg: Apache/2.0.41 (UNIX) PHP/4.2.2 FooBar/1.2b */ SrvTk_FULL, /* eg: Apache/2.0.41 (UNIX) PHP/4.2.2 FooBar/1.2b */
SrvTk_PRODUCT_ONLY /* eg: Apache */ SrvTk_PRODUCT_ONLY, /* eg: Apache */
SrvTk_OFF /* eg: <blank> */
}; };
static enum server_token_type ap_server_tokens = SrvTk_FULL; static enum server_token_type ap_server_tokens = SrvTk_FULL;
@@ -2748,7 +2749,10 @@ AP_DECLARE(void) ap_add_version_component(apr_pool_t *pconf, const char *compone
*/ */
static void set_banner(apr_pool_t *pconf) static void set_banner(apr_pool_t *pconf)
{ {
if (ap_server_tokens == SrvTk_PRODUCT_ONLY) { if (ap_server_tokens == SrvTk_OFF) {
ap_add_version_component(pconf, "");
}
else if (ap_server_tokens == SrvTk_PRODUCT_ONLY) {
ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT); ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT);
} }
else if (ap_server_tokens == SrvTk_MINIMAL) { else if (ap_server_tokens == SrvTk_MINIMAL) {
@@ -2783,7 +2787,10 @@ static const char *set_serv_tokens(cmd_parms *cmd, void *dummy,
return err; return err;
} }
if (!strcasecmp(arg, "OS")) { if (!strcasecmp(arg, "Off")) {
ap_server_tokens = SrvTk_OFF;
}
else if (!strcasecmp(arg, "OS")) {
ap_server_tokens = SrvTk_OS; ap_server_tokens = SrvTk_OS;
} }
else if (!strcasecmp(arg, "Min") || !strcasecmp(arg, "Minimal")) { else if (!strcasecmp(arg, "Min") || !strcasecmp(arg, "Minimal")) {
@@ -3304,7 +3311,7 @@ AP_INIT_TAKE1("LogLevel", set_loglevel, NULL, RSRC_CONF,
AP_INIT_TAKE1("NameVirtualHost", ap_set_name_virtual_host, NULL, RSRC_CONF, AP_INIT_TAKE1("NameVirtualHost", ap_set_name_virtual_host, NULL, RSRC_CONF,
"A numeric IP address:port, or the name of a host"), "A numeric IP address:port, or the name of a host"),
AP_INIT_TAKE1("ServerTokens", set_serv_tokens, NULL, RSRC_CONF, AP_INIT_TAKE1("ServerTokens", set_serv_tokens, NULL, RSRC_CONF,
"Determine tokens displayed in the Server: header - Min(imal), OS or Full"), "Determine tokens displayed in the Server: header - Min(imal), Major, Minor, Prod, OS, Off or Full"),
AP_INIT_TAKE1("LimitRequestLine", set_limit_req_line, NULL, RSRC_CONF, AP_INIT_TAKE1("LimitRequestLine", set_limit_req_line, NULL, RSRC_CONF,
"Limit on maximum size of an HTTP request line"), "Limit on maximum size of an HTTP request line"),
AP_INIT_TAKE1("LimitRequestFieldsize", set_limit_req_fieldsize, NULL, AP_INIT_TAKE1("LimitRequestFieldsize", set_limit_req_fieldsize, NULL,

View File

@@ -553,7 +553,7 @@ static apr_status_t dummy_connection(ap_pod_t *pod)
* requests in their logs. * requests in their logs.
*/ */
srequest = apr_pstrcat(p, "OPTIONS * HTTP/1.0\r\nUser-Agent: ", srequest = apr_pstrcat(p, "OPTIONS * HTTP/1.0\r\nUser-Agent: ",
ap_get_server_banner(), ap_get_server_description(),
" (internal dummy connection)\r\n\r\n", NULL); " (internal dummy connection)\r\n\r\n", NULL);
/* Since some operating systems support buffering of data or entire /* Since some operating systems support buffering of data or entire