feat: Restrict use of masterKey to localhost by default (#8281)
BREAKING CHANGE: This release restricts the use of `masterKey` to localhost by default; if you are using Parse Dashboard on a different server to connect to Parse Server you need to add the IP address of the server that hosts Parse Dashboard to this option (#8281)
This commit is contained in:
@@ -435,9 +435,12 @@ export class Config {
|
||||
}
|
||||
|
||||
static validateMasterKeyIps(masterKeyIps) {
|
||||
for (const ip of masterKeyIps) {
|
||||
for (let ip of masterKeyIps) {
|
||||
if (ip.includes('/')) {
|
||||
ip = ip.split('/')[0];
|
||||
}
|
||||
if (!net.isIP(ip)) {
|
||||
throw `Invalid ip in masterKeyIps: ${ip}`;
|
||||
throw `The Parse Server option "masterKeyIps" contains an invalid IP address "${ip}".`;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -302,9 +302,10 @@ module.exports.ParseServerOptions = {
|
||||
},
|
||||
masterKeyIps: {
|
||||
env: 'PARSE_SERVER_MASTER_KEY_IPS',
|
||||
help: 'Restrict masterKey to be used by only these ips, defaults to [] (allow all ips)',
|
||||
help:
|
||||
"(Optional) Restricts the use of master key permissions to a list of IP addresses.<br><br>This option accepts a list of single IP addresses, for example:<br>`['10.0.0.1', '10.0.0.2']`<br><br>You can also use CIDR notation to specify an IP address range, for example:<br>`['10.0.1.0/24']`<br><br>Special cases:<br>- Setting an empty array `[]` means that `masterKey`` cannot be used even in Parse Server Cloud Code.<br>- Setting `['0.0.0.0/0']` means disabling the filter and the master key can be used from any IP address.<br><br>To connect Parse Dashboard from a different server requires to add the IP address of the server that hosts Parse Dashboard because Parse Dashboard uses the master key.<br><br>Defaults to `['127.0.0.1']` which means that only `localhost`, the server itself, is allowed to use the master key.",
|
||||
action: parsers.arrayParser,
|
||||
default: [],
|
||||
default: ['127.0.0.1'],
|
||||
},
|
||||
maxLimit: {
|
||||
env: 'PARSE_SERVER_MAX_LIMIT',
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
* @property {String} logLevel Sets the level for logs
|
||||
* @property {String} logsFolder Folder for the logs (defaults to './logs'); set to null to disable file based logging
|
||||
* @property {String} masterKey Your Parse Master Key
|
||||
* @property {String[]} masterKeyIps Restrict masterKey to be used by only these ips, defaults to [] (allow all ips)
|
||||
* @property {String[]} masterKeyIps (Optional) Restricts the use of master key permissions to a list of IP addresses.<br><br>This option accepts a list of single IP addresses, for example:<br>`['10.0.0.1', '10.0.0.2']`<br><br>You can also use CIDR notation to specify an IP address range, for example:<br>`['10.0.1.0/24']`<br><br>Special cases:<br>- Setting an empty array `[]` means that `masterKey`` cannot be used even in Parse Server Cloud Code.<br>- Setting `['0.0.0.0/0']` means disabling the filter and the master key can be used from any IP address.<br><br>To connect Parse Dashboard from a different server requires to add the IP address of the server that hosts Parse Dashboard because Parse Dashboard uses the master key.<br><br>Defaults to `['127.0.0.1']` which means that only `localhost`, the server itself, is allowed to use the master key.
|
||||
* @property {Number} maxLimit Max value for limit option on queries, defaults to unlimited
|
||||
* @property {Number|String} maxLogFiles Maximum number of logs to keep. If not set, no logs will be removed. This can be a number of files or number of days. If using days, add 'd' as the suffix. (default: null)
|
||||
* @property {String} maxUploadSize Max file size for uploads, defaults to 20mb
|
||||
|
||||
@@ -49,8 +49,8 @@ export interface ParseServerOptions {
|
||||
/* URL to your parse server with http:// or https://.
|
||||
:ENV: PARSE_SERVER_URL */
|
||||
serverURL: string;
|
||||
/* Restrict masterKey to be used by only these ips, defaults to [] (allow all ips)
|
||||
:DEFAULT: [] */
|
||||
/* (Optional) Restricts the use of master key permissions to a list of IP addresses.<br><br>This option accepts a list of single IP addresses, for example:<br>`['10.0.0.1', '10.0.0.2']`<br><br>You can also use CIDR notation to specify an IP address range, for example:<br>`['10.0.1.0/24']`<br><br>Special cases:<br>- Setting an empty array `[]` means that `masterKey`` cannot be used even in Parse Server Cloud Code.<br>- Setting `['0.0.0.0/0']` means disabling the filter and the master key can be used from any IP address.<br><br>To connect Parse Dashboard from a different server requires to add the IP address of the server that hosts Parse Dashboard because Parse Dashboard uses the master key.<br><br>Defaults to `['127.0.0.1']` which means that only `localhost`, the server itself, is allowed to use the master key.
|
||||
:DEFAULT: ["127.0.0.1"] */
|
||||
masterKeyIps: ?(string[]);
|
||||
/* Sets the app name */
|
||||
appName: ?string;
|
||||
|
||||
@@ -7,6 +7,7 @@ import defaultLogger from './logger';
|
||||
import rest from './rest';
|
||||
import MongoStorageAdapter from './Adapters/Storage/Mongo/MongoStorageAdapter';
|
||||
import PostgresStorageAdapter from './Adapters/Storage/Postgres/PostgresStorageAdapter';
|
||||
import ipRangeCheck from 'ip-range-check';
|
||||
|
||||
export const DEFAULT_ALLOWED_HEADERS =
|
||||
'X-Parse-Master-Key, X-Parse-REST-API-Key, X-Parse-Javascript-Key, X-Parse-Application-Id, X-Parse-Client-Version, X-Parse-Session-Token, X-Requested-With, X-Parse-Revocable-Session, X-Parse-Request-Id, Content-Type, Pragma, Cache-Control';
|
||||
@@ -164,17 +165,11 @@ export function handleParseHeaders(req, res, next) {
|
||||
req.config.ip = clientIp;
|
||||
req.info = info;
|
||||
|
||||
if (
|
||||
info.masterKey &&
|
||||
req.config.masterKeyIps &&
|
||||
req.config.masterKeyIps.length !== 0 &&
|
||||
req.config.masterKeyIps.indexOf(clientIp) === -1
|
||||
) {
|
||||
return invalidRequest(req, res);
|
||||
let isMaster = info.masterKey === req.config.masterKey;
|
||||
if (isMaster && !ipRangeCheck(clientIp, req.config.masterKeyIps || [])) {
|
||||
isMaster = false;
|
||||
}
|
||||
|
||||
var isMaster = info.masterKey === req.config.masterKey;
|
||||
|
||||
if (isMaster) {
|
||||
req.auth = new auth.Auth({
|
||||
config: req.config,
|
||||
|
||||
Reference in New Issue
Block a user