mirror of
https://github.com/azures04/crafatar.git
synced 2026-05-06 11:00:39 +02:00
improve URL parsing
uses `new URL()` and `decodeURI()` instead of `url.parse()` also checks that the requested file is in a subdirectory of `public/` before serving the file fixes path traversal vulnerability GHSA-5cxq-25mp-q5f2
This commit is contained in:
@@ -14,12 +14,10 @@ function handle_default(img_status, userId, size, def, req, err, callback) {
|
||||
if (defname !== "steve" && defname !== "mhf_steve" && defname !== "alex" && defname !== "mhf_alex") {
|
||||
if (helpers.id_valid(def)) {
|
||||
// clean up the old URL to match new image
|
||||
var parsed = req.url;
|
||||
delete parsed.query.default;
|
||||
delete parsed.search;
|
||||
parsed.path_list[1] = def;
|
||||
parsed.pathname = "/" + parsed.path_list.join("/");
|
||||
var newUrl = url.format(parsed);
|
||||
req.url.searchParams.delete('default');
|
||||
req.url.path_list[1] = def;
|
||||
req.url.pathname = req.url.path_list.join('/');
|
||||
var newUrl = req.url.toString();
|
||||
callback({
|
||||
status: img_status,
|
||||
redirect: newUrl,
|
||||
@@ -53,9 +51,9 @@ function handle_default(img_status, userId, size, def, req, err, callback) {
|
||||
// GET avatar request
|
||||
module.exports = function(req, callback) {
|
||||
var userId = (req.url.path_list[1] || "").split(".")[0];
|
||||
var size = parseInt(req.url.query.size) || config.avatars.default_size;
|
||||
var def = req.url.query.default;
|
||||
var overlay = Object.prototype.hasOwnProperty.call(req.url.query, "overlay") || Object.prototype.hasOwnProperty.call(req.url.query, "helm");
|
||||
var size = parseInt(req.url.searchParams.get("size")) || config.avatars.default_size;
|
||||
var def = req.url.searchParams.get("default");
|
||||
var overlay = req.url.searchParams.has("overlay") || req.url.searchParams.has("helm");
|
||||
|
||||
// check for extra paths
|
||||
if (req.url.path_list.length > 2) {
|
||||
|
||||
@@ -4,7 +4,7 @@ var cache = require("../cache");
|
||||
// GET cape request
|
||||
module.exports = function(req, callback) {
|
||||
var userId = (req.url.path_list[1] || "").split(".")[0];
|
||||
var def = req.url.query.default;
|
||||
var def = req.url.searchParams.get('default');
|
||||
var rid = req.id;
|
||||
|
||||
// check for extra paths
|
||||
|
||||
@@ -17,12 +17,10 @@ function handle_default(rid, scale, overlay, body, img_status, userId, size, def
|
||||
if (defname !== "steve" && defname !== "mhf_steve" && defname !== "alex" && defname !== "mhf_alex") {
|
||||
if (helpers.id_valid(def)) {
|
||||
// clean up the old URL to match new image
|
||||
var parsed = req.url;
|
||||
delete parsed.query.default;
|
||||
delete parsed.search;
|
||||
parsed.path_list[2] = def;
|
||||
parsed.pathname = "/" + parsed.path_list.join("/");
|
||||
var newUrl = url.format(parsed);
|
||||
req.url.searchParams.delete('default');
|
||||
req.url.path_list[2] = def;
|
||||
req.url.pathname = req.url.path_list.join('/');
|
||||
var newUrl = req.url.toString();
|
||||
callback({
|
||||
status: img_status,
|
||||
redirect: newUrl,
|
||||
@@ -62,9 +60,9 @@ module.exports = function(req, callback) {
|
||||
var rid = req.id;
|
||||
var body = raw_type === "body";
|
||||
var userId = (req.url.path_list[2] || "").split(".")[0];
|
||||
var def = req.url.query.default;
|
||||
var scale = parseInt(req.url.query.scale) || config.renders.default_scale;
|
||||
var overlay = Object.prototype.hasOwnProperty.call(req.url.query, "overlay") || Object.prototype.hasOwnProperty.call(req.url.query, "helm");
|
||||
var def = req.url.searchParams.get("default");
|
||||
var scale = parseInt(req.url.searchParams.get("scale")) || config.renders.default_scale;
|
||||
var overlay = req.url.searchParams.has("overlay") || req.url.searchParams.has("helm");
|
||||
|
||||
// check for extra paths
|
||||
if (req.url.path_list.length > 3) {
|
||||
|
||||
@@ -14,12 +14,10 @@ function handle_default(img_status, userId, def, req, err, callback) {
|
||||
if (defname !== "steve" && defname !== "mhf_steve" && defname !== "alex" && defname !== "mhf_alex") {
|
||||
if (helpers.id_valid(def)) {
|
||||
// clean up the old URL to match new image
|
||||
var parsed = req.url;
|
||||
delete parsed.query.default;
|
||||
delete parsed.search;
|
||||
parsed.path_list[1] = def;
|
||||
parsed.pathname = "/" + parsed.path_list.join("/");
|
||||
var newUrl = url.format(parsed);
|
||||
req.url.searchParams.delete('default');
|
||||
req.url.path_list[1] = def;
|
||||
req.url.pathname = req.url.path_list.join('/');
|
||||
var newUrl = req.url.toString();
|
||||
callback({
|
||||
status: img_status,
|
||||
redirect: newUrl,
|
||||
@@ -62,7 +60,7 @@ function handle_default(img_status, userId, def, req, err, callback) {
|
||||
// GET skin request
|
||||
module.exports = function(req, callback) {
|
||||
var userId = (req.url.path_list[1] || "").split(".")[0];
|
||||
var def = req.url.query.default;
|
||||
var def = req.url.searchParams.get("default");
|
||||
var rid = req.id;
|
||||
|
||||
// check for extra paths
|
||||
|
||||
Reference in New Issue
Block a user