Security Fix JVN#86586539: Stored XSS.

Thanks to Ryoya Koyama of Mitsui Bussan Secure Directions, Inc and xet7.
This commit is contained in:
Lauri Ojansivu 2025-10-10 23:14:06 +03:00
parent a0b94065c5
commit ee79cab7b2
9 changed files with 248 additions and 75 deletions

View file

@ -1756,10 +1756,20 @@ Cards.helpers({
},
setTitle(title) {
// Sanitize title on client side as well
let sanitizedTitle = title;
if (typeof title === 'string') {
const { sanitizeTitle } = require('/server/lib/inputSanitizer');
sanitizedTitle = sanitizeTitle(title);
if (process.env.DEBUG === 'true' && sanitizedTitle !== title) {
console.warn('Client-side sanitized card title:', title, '->', sanitizedTitle);
}
}
if (this.isLinkedBoard()) {
return Boards.update({ _id: this.linkedId }, { $set: { title } });
return Boards.update({ _id: this.linkedId }, { $set: { title: sanitizedTitle } });
} else {
return Cards.update({ _id: this.getRealId() }, { $set: { title } });
return Cards.update({ _id: this.getRealId() }, { $set: { title: sanitizedTitle } });
}
},
@ -3565,7 +3575,13 @@ JsonRoutes.add('GET', '/api/boards/:boardId/cards_count', function(
Authentication.checkBoardAccess(req.userId, paramBoardId);
if (req.body.title) {
const newTitle = req.body.title;
const { sanitizeTitle } = require('/server/lib/inputSanitizer');
const newTitle = sanitizeTitle(req.body.title);
if (process.env.DEBUG === 'true' && newTitle !== req.body.title) {
console.warn('Sanitized card title input:', req.body.title, '->', newTitle);
}
Cards.direct.update(
{
_id: paramCardId,