Skip to content

Commit 6f800be

Browse files
committed
Fix for issue with links from actors
1 parent 52af047 commit 6f800be

File tree

3 files changed

+74
-11
lines changed

3 files changed

+74
-11
lines changed

cypress/platform/xss15.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
// fontFamily: 'courier',
7171
fontSize: 18,
7272
curve: 'basis',
73-
securityLevel: 'strict ',
73+
securityLevel: 'strict',
7474
startOnLoad: false,
7575
secure: ['secure', 'securityLevel', 'startOnLoad', 'maxTextSize'],
7676
// themeVariables: {relationLabelColor: 'red'}
@@ -90,7 +90,7 @@
9090
var diagram = `sequenceDiagram
9191
participant John
9292
links John: {"XSS": "javas`;
93-
diagram += 'cript:alert(window.opener.document.domain)"}';
93+
diagram += `cript:alert('AudioParam')"}`;
9494

9595
// var diagram = "stateDiagram-v2\n";
9696
// diagram += "<img/src='1'/onerror"

src/diagrams/common/common.js

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,24 @@ export const getRows = (s) => {
1313
return str.split('#br#');
1414
};
1515

16+
export const removeEscapes = (text) => {
17+
let newStr = text.replace(/\\u[\dA-F]{4}/gi, function (match) {
18+
return String.fromCharCode(parseInt(match.replace(/\\u/g, ''), 16));
19+
});
20+
21+
console.log(newStr);
22+
23+
newStr = newStr.replace(/\\x([0-9a-f]{2})/gi, (_, c) => String.fromCharCode(parseInt(c, 16)));
24+
newStr = newStr.replace(/\\[\d\d\d]{3}/gi, function (match) {
25+
return String.fromCharCode(parseInt(match.replace(/\\/g, ''), 8));
26+
});
27+
newStr = newStr.replace(/\\[\d\d\d]{2}/gi, function (match) {
28+
return String.fromCharCode(parseInt(match.replace(/\\/g, ''), 8));
29+
});
30+
31+
return newStr;
32+
};
33+
1634
/**
1735
* Removes script tags from a text
1836
*
@@ -40,13 +58,12 @@ export const removeScript = (txt) => {
4058
break;
4159
}
4260
}
43-
44-
rs = rs.replace(/script>/gi, '#');
45-
rs = rs.replace(/script>/gi, '#');
46-
rs = rs.replace(/javascript:/gi, '#');
47-
rs = rs.replace(/onerror=/gi, 'onerror:');
48-
rs = rs.replace(/<iframe/gi, '');
49-
return rs;
61+
let decodedText = removeEscapes(rs);
62+
decodedText = decodedText.replace(/script>/gi, '#');
63+
decodedText = decodedText.replace(/javascript:/gi, '#');
64+
decodedText = decodedText.replace(/onerror=/gi, 'onerror:');
65+
decodedText = decodedText.replace(/<iframe/gi, '');
66+
return decodedText;
5067
};
5168

5269
const sanitizeMore = (text, config) => {
@@ -62,7 +79,7 @@ const sanitizeMore = (text, config) => {
6279
if (htmlLabels) {
6380
const level = config.securityLevel;
6481

65-
if (level === 'antiscript') {
82+
if (level === 'antiscript' || level === 'strict') {
6683
txt = removeScript(txt);
6784
} else if (level !== 'loose') {
6885
// eslint-disable-line
@@ -171,4 +188,5 @@ export default {
171188
removeScript,
172189
getUrl,
173190
evaluate,
191+
removeEscapes,
174192
};

src/diagrams/common/common.spec.js

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { removeScript } from './common';
1+
import { removeScript, removeEscapes } from './common';
22

33
describe('when securityLevel is antiscript, all script must be removed', function () {
44
it('should remove all script block, script inline.', function () {
@@ -24,3 +24,48 @@ describe('when securityLevel is antiscript, all script must be removed', functio
2424
expect(isEqual).toEqual(true);
2525
});
2626
});
27+
28+
describe('remove escape code in text', function () {
29+
it('should remove a unicode colon', function () {
30+
const labelString = '\\u003A';
31+
32+
const result = removeEscapes(labelString);
33+
expect(result).toEqual(':');
34+
});
35+
it('should remove a hex colon', function () {
36+
const labelString = '\\x3A';
37+
38+
const result = removeEscapes(labelString);
39+
expect(result).toEqual(':');
40+
});
41+
it('should remove a oct colon', function () {
42+
const labelString = '\\72';
43+
44+
const result = removeEscapes(labelString);
45+
expect(result).toEqual(':');
46+
});
47+
it('should remove a oct colon 3 numbers', function () {
48+
const labelString = '\\072';
49+
50+
const result = removeEscapes(labelString);
51+
expect(result).toEqual(':');
52+
});
53+
it('should remove multiple colons 3 numbers', function () {
54+
const labelString = '\\072\\072\\72';
55+
56+
const result = removeEscapes(labelString);
57+
expect(result).toEqual(':::');
58+
});
59+
it('should handle greater and smaller then', function () {
60+
const labelString = '\\74\\076';
61+
62+
const result = removeEscapes(labelString);
63+
expect(result).toEqual('<>');
64+
});
65+
it('should handle letters', function () {
66+
const labelString = '\\u0073\\143ri\\x70\\u0074\\x3A';
67+
68+
const result = removeEscapes(labelString);
69+
expect(result).toEqual('script:');
70+
});
71+
});

0 commit comments

Comments
 (0)