Since we're extending core_dir_config, we should document the
change in core_dir_config
Aaron Bannert wrote:
>
> If there's no objection, shall I just go ahead and commit this?
> -aaron
>
> On Mar 24, 2005, at 4:38 PM, Aaron Bannert wrote:
>
> > I've attached a patch against the trunk of Apache 1.3 that backports
> > support for the AllowEncodedSlashes directive. It should behave
> > identically to the way it works in 2.0. By default Apache will disallow
> > any request that includes a %-encoded slash ('/') character (which
> > is '%2F'), but by enabling this directive an administrator can override
> > this prevention and allow %2Fs in request URLs. If this is an
> > acceptable
> > backport, and I can get some +1s for it, I'll be happy to commit it and
> > update the documentation (at least the English :).
> >
> > -aaron
> >
> > Index: src/include/httpd.h
> > ===================================================================
> > --- src/include/httpd.h (revision 158971)
> > +++ src/include/httpd.h (working copy)
> > @@ -976,6 +976,7 @@
> >
> > API_EXPORT(int) ap_is_url(const char *u);
> > API_EXPORT(int) ap_unescape_url(char *url);
> > +API_EXPORT(int) ap_unescape_url_keep2f(char *url);
> > API_EXPORT(void) ap_no2slash(char *name);
> > API_EXPORT(void) ap_getparents(char *name);
> > API_EXPORT(char *) ap_escape_path_segment(pool *p, const char *s);
> > Index: src/include/http_core.h
> > ===================================================================
> > --- src/include/http_core.h (revision 158971)
> > +++ src/include/http_core.h (working copy)
> > @@ -318,6 +318,8 @@
> > /* Digest auth. */
> > char *ap_auth_nonce;
> >
> > + unsigned int allow_encoded_slashes : 1; /* URLs may contain %2f
> > w/o being
> > + * pitched indiscriminately */
> > } core_dir_config;
> >
> > /* Per-server core configuration */
> > Index: src/main/util.c
> > ===================================================================
> > --- src/main/util.c (revision 158971)
> > +++ src/main/util.c (working copy)
> > @@ -1635,6 +1635,53 @@
> > return OK;
> > }
> >
> > +API_EXPORT(int) ap_unescape_url_keep2f(char *url)
> > +{
> > + register int badesc, badpath;
> > + char *x, *y;
> > +
> > + badesc = 0;
> > + badpath = 0;
> > + /* Initial scan for first '%'. Don't bother writing values before
> > + * seeing a '%' */
> > + y = strchr(url, '%');
> > + if (y == NULL) {
> > + return OK;
> > + }
> > + for (x = y; *y; ++x, ++y) {
> > + if (*y != '%') {
> > + *x = *y;
> > + }
> > + else {
> > + if (!ap_isxdigit(*(y + 1)) || !ap_isxdigit(*(y + 2))) {
> > + badesc = 1;
> > + *x = '%';
> > + }
> > + else {
> > + char decoded;
> > + decoded = x2c(y + 1);
> > + if (decoded == '\0') {
> > + badpath = 1;
> > + }
> > + else {
> > + *x = decoded;
> > + y += 2;
> > + }
> > + }
> > + }
> > + }
> > + *x = '\0';
> > + if (badesc) {
> > + return BAD_REQUEST;
> > + }
> > + else if (badpath) {
> > + return NOT_FOUND;
> > + }
> > + else {
> > + return OK;
> > + }
> > +}
> > +
> > API_EXPORT(char *) ap_construct_server(pool *p, const char *hostname,
> > unsigned port, const request_rec *r)
> > {
> > Index: src/main/http_request.c
> > ===================================================================
> > --- src/main/http_request.c (revision 158971)
> > +++ src/main/http_request.c (working copy)
> > @@ -1175,8 +1175,21 @@
> >
> > /* Ignore embedded %2F's in path for proxy requests */
> > if (r->proxyreq == NOT_PROXY && r->parsed_uri.path) {
> > - access_status = ap_unescape_url(r->parsed_uri.path);
> > + core_dir_config *d;
> > + d = ap_get_module_config(r->per_dir_config, &core_module);
> > + if (d->allow_encoded_slashes) {
> > + access_status = ap_unescape_url_keep2f(r->parsed_uri.path);
> > + }
> > + else {
> > + access_status = ap_unescape_url(r->parsed_uri.path);
> > + }
> > if (access_status) {
> > + if (! d->allow_encoded_slashes) {
> > + ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, r,
> > + "found %%2f (encoded '/') in URI "
> > + "(decoded='%s'), returning 404",
> > + r->parsed_uri.path);
> > + }
> > ap_die(access_status, r);
> > return;
> > }
> > Index: src/main/http_core.c
> > ===================================================================
> > --- src/main/http_core.c (revision 158971)
> > +++ src/main/http_core.c (working copy)
> > @@ -143,6 +143,9 @@
> > conf->etag_add = ETAG_UNSET;
> > conf->etag_remove = ETAG_UNSET;
> >
> > + /* disallow %2f (encoded '/') by default */
> > + conf->allow_encoded_slashes = 0;
> > +
> > return (void *)conf;
> > }
> >
> > @@ -319,6 +322,8 @@
> > conf->cgi_command_args = new->cgi_command_args;
> > }
> >
> > + conf->allow_encoded_slashes = new->allow_encoded_slashes;
> > +
> > return (void*)conf;
> > }
> >
> > @@ -2309,6 +2314,18 @@
> > }
> > #endif /* AP_ENABLE_EXCEPTION_HOOK */
> >
> > +static const char *set_allow2f(cmd_parms *cmd, core_dir_config *d,
> > int arg)
> > +{
> > + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
> > +
> > + if (err != NULL) {
> > + return err;
> > + }
> > +
> > + d->allow_encoded_slashes = (arg != 0);
> > + return NULL;
> > +}
> > +
> > static const char *set_pidfile(cmd_parms *cmd, void *dummy, char *arg)
> > {
> > const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
> > @@ -3551,6 +3568,8 @@
> > { "ErrorLog", set_server_string_slot,
> > (void *)XtOffsetOf (server_rec, error_fname), RSRC_CONF, TAKE1,
> > "The filename of the error log" },
> > +{ "AllowEncodedSlashes", set_allow2f, NULL, RSRC_CONF, FLAG,
> > + "Allow URLs containing '/' encoded as '%2F'"},
> > { "PidFile", set_pidfile, NULL, RSRC_CONF, TAKE1,
> > "A file for logging the server process ID"},
> > { "ScoreBoardFile", set_scoreboard, NULL, RSRC_CONF, TAKE1,
> >
>
--
===========================================================================
Jim Jagielski [|] [EMAIL PROTECTED] [|] http://www.jaguNET.com/
"There 10 types of people: those who read binary and everyone else."