From: Rafał Miłecki <ra...@milecki.pl>

By default uhttpd replies with Access-Control-Allow-Origin containing
URL from the request Origin header. It allows sending CORS requests from
any website allowing attacks.

Add support for -o option that allows specifying a single URL to be put
in the Access-Control-Allow-Origin.

Signed-off-by: Rafał Miłecki <ra...@milecki.pl>
---
I use this patch with addition of a single init.d script line:
append_arg "$cfg" ubus_origin "-o"

Does anyone find it useful?
---
 main.c   | 7 ++++++-
 ubus.c   | 2 +-
 uhttpd.h | 1 +
 3 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/main.c b/main.c
index 73e3d42..c5f2fe4 100644
--- a/main.c
+++ b/main.c
@@ -263,7 +263,7 @@ int main(int argc, char **argv)
        init_defaults_pre();
        signal(SIGPIPE, SIG_IGN);
 
-       while ((ch = getopt(argc, argv, 
"A:aC:c:Dd:E:e:fh:H:I:i:K:k:L:l:m:N:n:P:p:qRr:Ss:T:t:U:u:Xx:y:")) != -1) {
+       while ((ch = getopt(argc, argv, 
"A:aC:c:Dd:E:e:fh:H:I:i:K:k:L:l:m:N:n:o:P:p:qRr:Ss:T:t:U:u:Xx:y:")) != -1) {
                switch(ch) {
 #ifdef HAVE_TLS
                case 'C':
@@ -492,6 +492,10 @@ int main(int argc, char **argv)
                        conf.ubus_cors = 1;
                        break;
 
+               case 'o':
+                       conf.ubus_origin = optarg;
+                       break;
+
                case 'e':
                        conf.events_retry = atoi(optarg);
                        break;
@@ -500,6 +504,7 @@ int main(int argc, char **argv)
                case 'u':
                case 'U':
                case 'X':
+               case 'o':
                case 'e':
                        fprintf(stderr, "uhttpd: UBUS support not compiled, "
                                        "ignoring -%c\n", ch);
diff --git a/ubus.c b/ubus.c
index 39b38b2..27c1c95 100644
--- a/ubus.c
+++ b/ubus.c
@@ -169,7 +169,7 @@ static void uh_ubus_add_cors_headers(struct client *cl)
        }
 
        ustream_printf(cl->us, "Access-Control-Allow-Origin: %s\r\n",
-                      blobmsg_get_string(tb[HDR_ORIGIN]));
+                      conf.ubus_origin ? conf.ubus_origin : 
blobmsg_get_string(tb[HDR_ORIGIN]));
 
        if (tb[HDR_ACCESS_CONTROL_REQUEST_HEADERS])
                ustream_printf(cl->us, "Access-Control-Allow-Headers: %s\r\n",
diff --git a/uhttpd.h b/uhttpd.h
index e61e176..f924c77 100644
--- a/uhttpd.h
+++ b/uhttpd.h
@@ -81,6 +81,7 @@ struct config {
        int script_timeout;
        int ubus_noauth;
        int ubus_cors;
+       const char *ubus_origin;
        int cgi_prefix_len;
        int events_retry;
        struct list_head cgi_alias;
-- 
2.27.0


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to