Skip to content

Commit 39b0e05

Browse files
committedJun 5, 2023
fix security bug
1 parent e7728af commit 39b0e05

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed
 

‎spec/entities_spec.js

+18
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,24 @@ describe("XMLParser Entities", function() {
376376

377377
expect(result).toEqual(expected);
378378
});
379+
it("should throw error if an entity name contains special char", function() {
380+
const xmlData = `
381+
<?xml version="1.0" encoding="UTF-8"?>
382+
383+
<!DOCTYPE note [
384+
<!ENTITY nj$ "writer;">
385+
<!ENTITY wr?er "Writer: Donald Duck.">
386+
]>`;
387+
388+
const options = {
389+
processEntities: true,
390+
};
391+
392+
expect(() =>{
393+
const parser = new XMLParser(options);
394+
parser.parse(xmlData);
395+
}).toThrowError("Invalid character $ in entity name")
396+
});
379397
});
380398

381399
describe("XMLParser External Entites", function() {

‎src/xmlparser/DocTypeReader.js

+13-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ function readDocType(xmlData, i){
1919
i += 7;
2020
[entityName, val,i] = readEntityExp(xmlData,i+1);
2121
if(val.indexOf("&") === -1) //Parameter entities are not supported
22-
entities[ entityName ] = {
22+
entities[ validateEntityName(entityName) ] = {
2323
regx : RegExp( `&${entityName};`,"g"),
2424
val: val
2525
};
@@ -140,4 +140,16 @@ function isNotation(xmlData, i){
140140
return false
141141
}
142142

143+
//an entity name should not contains special characters that may be used in regex
144+
//Eg !?\\\/[]$%{}^&*()<>
145+
const specialChar = "!?\\\/[]$%{}^&*()<>";
146+
147+
function validateEntityName(name){
148+
for (let i = 0; i < specialChar.length; i++) {
149+
const ch = specialChar[i];
150+
if(name.indexOf(ch) !== -1) throw new Error(`Invalid character ${ch} in entity name`);
151+
}
152+
return name;
153+
}
154+
143155
module.exports = readDocType;

0 commit comments

Comments
 (0)
Please sign in to comment.