Merge pull request #11885 from dpeukert/master
Check if the X-XSS-Protection header contains the required fields
This commit is contained in:
commit
efee380e95
2 changed files with 118 additions and 9 deletions
|
@ -422,7 +422,6 @@
|
|||
|
||||
if (xhr.status === 200) {
|
||||
var securityHeaders = {
|
||||
'X-XSS-Protection': ['1; mode=block'],
|
||||
'X-Content-Type-Options': ['nosniff'],
|
||||
'X-Robots-Tag': ['none'],
|
||||
'X-Frame-Options': ['SAMEORIGIN', 'DENY'],
|
||||
|
@ -443,6 +442,18 @@
|
|||
}
|
||||
}
|
||||
|
||||
var xssfields = xhr.getResponseHeader('X-XSS-Protection') ? xhr.getResponseHeader('X-XSS-Protection').split(';').map(function(item) { return item.trim(); }) : [];
|
||||
if (xssfields.length === 0 || xssfields.indexOf('1') === -1 || xssfields.indexOf('mode=block') === -1) {
|
||||
messages.push({
|
||||
msg: t('core', 'The "{header}" HTTP header doesn\'t contain "{expected}". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.',
|
||||
{
|
||||
header: 'X-XSS-Protection',
|
||||
expected: '1; mode=block'
|
||||
}),
|
||||
type: OC.SetupChecks.MESSAGE_TYPE_WARNING
|
||||
});
|
||||
}
|
||||
|
||||
if (!xhr.getResponseHeader('Referrer-Policy') ||
|
||||
(xhr.getResponseHeader('Referrer-Policy').toLowerCase() !== 'no-referrer' &&
|
||||
xhr.getResponseHeader('Referrer-Policy').toLowerCase() !== 'no-referrer-when-downgrade' &&
|
||||
|
|
|
@ -811,9 +811,6 @@ describe('OC.SetupChecks tests', function() {
|
|||
async.done(function( data, s, x ){
|
||||
expect(data).toEqual([
|
||||
{
|
||||
msg: 'The "X-XSS-Protection" HTTP header is not set to "1; mode=block". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.',
|
||||
type: OC.SetupChecks.MESSAGE_TYPE_WARNING
|
||||
}, {
|
||||
msg: 'The "X-Content-Type-Options" HTTP header is not set to "nosniff". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.',
|
||||
type: OC.SetupChecks.MESSAGE_TYPE_WARNING
|
||||
}, {
|
||||
|
@ -829,6 +826,9 @@ describe('OC.SetupChecks tests', function() {
|
|||
}, {
|
||||
msg: 'The "X-Permitted-Cross-Domain-Policies" HTTP header is not set to "none". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.',
|
||||
type: OC.SetupChecks.MESSAGE_TYPE_WARNING
|
||||
}, {
|
||||
msg: 'The "X-XSS-Protection" HTTP header doesn\'t contain "1; mode=block". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.',
|
||||
type: OC.SetupChecks.MESSAGE_TYPE_WARNING
|
||||
}, {
|
||||
msg: 'The "Referrer-Policy" HTTP header is not set to "no-referrer", "no-referrer-when-downgrade", "strict-origin", "strict-origin-when-cross-origin" or "same-origin". This can leak referer information. See the <a href="https://www.w3.org/TR/referrer-policy/" rel="noreferrer noopener">W3C Recommendation ↗</a>.',
|
||||
type: OC.SetupChecks.MESSAGE_TYPE_INFO
|
||||
|
@ -855,13 +855,15 @@ describe('OC.SetupChecks tests', function() {
|
|||
);
|
||||
|
||||
async.done(function( data, s, x ){
|
||||
expect(data).toEqual([{
|
||||
msg: 'The "X-XSS-Protection" HTTP header is not set to "1; mode=block". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.',
|
||||
type: OC.SetupChecks.MESSAGE_TYPE_WARNING,
|
||||
}, {
|
||||
expect(data).toEqual([
|
||||
{
|
||||
msg: 'The "X-Content-Type-Options" HTTP header is not set to "nosniff". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.',
|
||||
type: OC.SetupChecks.MESSAGE_TYPE_WARNING
|
||||
}]);
|
||||
}, {
|
||||
msg: 'The "X-XSS-Protection" HTTP header doesn\'t contain "1; mode=block". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.',
|
||||
type: OC.SetupChecks.MESSAGE_TYPE_WARNING,
|
||||
}
|
||||
]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
@ -890,6 +892,102 @@ describe('OC.SetupChecks tests', function() {
|
|||
});
|
||||
});
|
||||
|
||||
describe('check X-XSS-Protection header', function() {
|
||||
it('should return no message if X-XSS-Protection is set to 1; mode=block; report=https://example.com', function(done) {
|
||||
protocolStub.returns('https');
|
||||
var result = OC.SetupChecks.checkGeneric();
|
||||
|
||||
suite.server.requests[0].respond(200, {
|
||||
'Strict-Transport-Security': 'max-age=15768000',
|
||||
'X-XSS-Protection': '1; mode=block; report=https://example.com',
|
||||
'X-Content-Type-Options': 'nosniff',
|
||||
'X-Robots-Tag': 'none',
|
||||
'X-Frame-Options': 'SAMEORIGIN',
|
||||
'X-Download-Options': 'noopen',
|
||||
'X-Permitted-Cross-Domain-Policies': 'none',
|
||||
'Referrer-Policy': 'no-referrer',
|
||||
});
|
||||
|
||||
result.done(function( data, s, x ){
|
||||
expect(data).toEqual([]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should return no message if X-XSS-Protection is set to 1; mode=block', function(done) {
|
||||
protocolStub.returns('https');
|
||||
var result = OC.SetupChecks.checkGeneric();
|
||||
|
||||
suite.server.requests[0].respond(200, {
|
||||
'Strict-Transport-Security': 'max-age=15768000',
|
||||
'X-XSS-Protection': '1; mode=block',
|
||||
'X-Content-Type-Options': 'nosniff',
|
||||
'X-Robots-Tag': 'none',
|
||||
'X-Frame-Options': 'SAMEORIGIN',
|
||||
'X-Download-Options': 'noopen',
|
||||
'X-Permitted-Cross-Domain-Policies': 'none',
|
||||
'Referrer-Policy': 'no-referrer',
|
||||
});
|
||||
|
||||
result.done(function( data, s, x ){
|
||||
expect(data).toEqual([]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should return a message if X-XSS-Protection is set to 1', function(done) {
|
||||
protocolStub.returns('https');
|
||||
var result = OC.SetupChecks.checkGeneric();
|
||||
|
||||
suite.server.requests[0].respond(200, {
|
||||
'Strict-Transport-Security': 'max-age=15768000',
|
||||
'X-XSS-Protection': '1',
|
||||
'X-Content-Type-Options': 'nosniff',
|
||||
'X-Robots-Tag': 'none',
|
||||
'X-Frame-Options': 'SAMEORIGIN',
|
||||
'X-Download-Options': 'noopen',
|
||||
'X-Permitted-Cross-Domain-Policies': 'none',
|
||||
'Referrer-Policy': 'no-referrer',
|
||||
});
|
||||
|
||||
result.done(function( data, s, x ){
|
||||
expect(data).toEqual([
|
||||
{
|
||||
msg: 'The "X-XSS-Protection" HTTP header doesn\'t contain "1; mode=block". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.',
|
||||
type: OC.SetupChecks.MESSAGE_TYPE_WARNING
|
||||
}
|
||||
]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should return a message if X-XSS-Protection is set to 0', function(done) {
|
||||
protocolStub.returns('https');
|
||||
var result = OC.SetupChecks.checkGeneric();
|
||||
|
||||
suite.server.requests[0].respond(200, {
|
||||
'Strict-Transport-Security': 'max-age=15768000',
|
||||
'X-XSS-Protection': '0',
|
||||
'X-Content-Type-Options': 'nosniff',
|
||||
'X-Robots-Tag': 'none',
|
||||
'X-Frame-Options': 'SAMEORIGIN',
|
||||
'X-Download-Options': 'noopen',
|
||||
'X-Permitted-Cross-Domain-Policies': 'none',
|
||||
'Referrer-Policy': 'no-referrer',
|
||||
});
|
||||
|
||||
result.done(function( data, s, x ){
|
||||
expect(data).toEqual([
|
||||
{
|
||||
msg: 'The "X-XSS-Protection" HTTP header doesn\'t contain "1; mode=block". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.',
|
||||
type: OC.SetupChecks.MESSAGE_TYPE_WARNING
|
||||
}
|
||||
]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('check Referrer-Policy header', function() {
|
||||
it('should return no message if Referrer-Policy is set to no-referrer', function(done) {
|
||||
protocolStub.returns('https');
|
||||
|
|
Loading…
Reference in a new issue