mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
Move security related test cases into a its own file.
This commit is contained in:
parent
44de0f15c9
commit
33f8f28209
|
@ -7,13 +7,12 @@ import {
|
||||||
nextBuild,
|
nextBuild,
|
||||||
startApp,
|
startApp,
|
||||||
stopApp,
|
stopApp,
|
||||||
renderViaHTTP,
|
renderViaHTTP
|
||||||
waitFor
|
|
||||||
} from 'next-test-utils'
|
} from 'next-test-utils'
|
||||||
import webdriver from 'next-webdriver'
|
import webdriver from 'next-webdriver'
|
||||||
import fetch from 'node-fetch'
|
import fetch from 'node-fetch'
|
||||||
import dynamicImportTests from '../../basic/test/dynamic'
|
import dynamicImportTests from '../../basic/test/dynamic'
|
||||||
import { readFileSync } from 'fs'
|
import security from './security'
|
||||||
|
|
||||||
const appDir = join(__dirname, '../')
|
const appDir = join(__dirname, '../')
|
||||||
let appPort
|
let appPort
|
||||||
|
@ -74,23 +73,6 @@ describe('Production Usage', () => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('With XSS Attacks', () => {
|
|
||||||
it('should prevent URI based attaks', async () => {
|
|
||||||
const browser = await webdriver(appPort, '/\',document.body.innerHTML="HACKED",\'')
|
|
||||||
// Wait 5 secs to make sure we load all the client side JS code
|
|
||||||
await waitFor(5000)
|
|
||||||
|
|
||||||
const bodyText = await browser
|
|
||||||
.elementByCss('body').text()
|
|
||||||
|
|
||||||
if (/HACKED/.test(bodyText)) {
|
|
||||||
throw new Error('Vulnerable to XSS attacks')
|
|
||||||
}
|
|
||||||
|
|
||||||
browser.close()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('Misc', () => {
|
describe('Misc', () => {
|
||||||
it('should handle already finished responses', async () => {
|
it('should handle already finished responses', async () => {
|
||||||
const res = {
|
const res = {
|
||||||
|
@ -111,21 +93,6 @@ describe('Production Usage', () => {
|
||||||
const data = await renderViaHTTP(appPort, '/static/data/item.txt')
|
const data = await renderViaHTTP(appPort, '/static/data/item.txt')
|
||||||
expect(data).toBe('item')
|
expect(data).toBe('item')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should only access files inside .next directory', async () => {
|
|
||||||
const buildId = readFileSync(join(__dirname, '../.next/BUILD_ID'), 'utf8')
|
|
||||||
|
|
||||||
const pathsToCheck = [
|
|
||||||
`/_next/${buildId}/page/../../../info`,
|
|
||||||
`/_next/${buildId}/page/../../../info.js`,
|
|
||||||
`/_next/${buildId}/page/../../../info.json`
|
|
||||||
]
|
|
||||||
|
|
||||||
for (const path of pathsToCheck) {
|
|
||||||
const data = await renderViaHTTP(appPort, path)
|
|
||||||
expect(data.includes('cool-version')).toBeFalsy()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('X-Powered-By header', () => {
|
describe('X-Powered-By header', () => {
|
||||||
|
@ -162,4 +129,6 @@ describe('Production Usage', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
dynamicImportTests(context, (p, q) => renderViaHTTP(context.appPort, p, q))
|
dynamicImportTests(context, (p, q) => renderViaHTTP(context.appPort, p, q))
|
||||||
|
|
||||||
|
security(context)
|
||||||
})
|
})
|
||||||
|
|
45
test/integration/production/test/security.js
Normal file
45
test/integration/production/test/security.js
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/* global describe, it, expect
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { readFileSync } from 'fs'
|
||||||
|
import { join } from 'path'
|
||||||
|
import { renderViaHTTP, waitFor } from 'next-test-utils'
|
||||||
|
import webdriver from 'next-webdriver'
|
||||||
|
|
||||||
|
module.exports = (context) => {
|
||||||
|
describe('With Security Related Issues', () => {
|
||||||
|
it('should only access files inside .next directory', async () => {
|
||||||
|
const buildId = readFileSync(join(__dirname, '../.next/BUILD_ID'), 'utf8')
|
||||||
|
|
||||||
|
const pathsToCheck = [
|
||||||
|
`/_next/${buildId}/page/../../../info`,
|
||||||
|
`/_next/${buildId}/page/../../../info.js`,
|
||||||
|
`/_next/${buildId}/page/../../../info.json`,
|
||||||
|
`/_next/:buildId/webpack/chunks/../../../info.json`,
|
||||||
|
`/_next/:buildId/webpack/../../../info.json`,
|
||||||
|
`/_next/../../../info.json`,
|
||||||
|
`/static/../../../info.json`
|
||||||
|
]
|
||||||
|
|
||||||
|
for (const path of pathsToCheck) {
|
||||||
|
const data = await renderViaHTTP(context.appPort, path)
|
||||||
|
expect(data.includes('cool-version')).toBeFalsy()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should prevent URI based XSS attacks', async () => {
|
||||||
|
const browser = await webdriver(context.appPort, '/\',document.body.innerHTML="HACKED",\'')
|
||||||
|
// Wait 5 secs to make sure we load all the client side JS code
|
||||||
|
await waitFor(5000)
|
||||||
|
|
||||||
|
const bodyText = await browser
|
||||||
|
.elementByCss('body').text()
|
||||||
|
|
||||||
|
if (/HACKED/.test(bodyText)) {
|
||||||
|
throw new Error('Vulnerable to XSS attacks')
|
||||||
|
}
|
||||||
|
|
||||||
|
browser.close()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in a new issue