メンションの昇格
以下の条件をすべて満たすとき、ユーザーは不正にeveryoneやhere、役職メンションを行うことが可能になる。
ユーザーはeveryoneやhere、役職メンションなどをする権限をもたない。
権限があったらそれは不正じゃないので。
Botがeveryoneやhere、役職メンションなどをする権限をもっている。
Botがユーザーの入力を適切に検証、エスケープしていない。
code:parrot.js
const { Client } = require("discord.js");
const client = new Client();
const prefix = "!";
const token = process.env.DISCORD_TOKEN;
async function onMessage(message) {
if (!message.guild) {
return;
}
if (l1 === prefix + "say") {
await message.channel.send(lines.join("\n"));
}
}
client.on("message", (message) => {
onMessage(message).catch((err) => console.error(err));
});
client.login(token);
https://gyazo.com/795a042f9f2ace7aecc33ac49f958c02
対処
推奨
全体でメンションを無効化し、個別に許可する
code:parrot2.js
// 推奨: 指定のないメッセージではメンションを無効化し、個別に許可する
const client = new Client({
allowedMentions: {
parse: []
}
});
個別に有効化/無効化する
この場合はユーザーに権限がある場合は素通りさせている
code:parrot3.js
const allowedMentions = message.member.permissions.has("MENTION_EVERYONE") ? {} : {
parse: []
};
//個別にメンションを無効化することもできる
await message.channel.send(lines.join("\n"), {
allowedMentions
});
エラーにする
code: parrot4.js
if (!message.member.permissions.has("MENTION_EVERYONE")) {
await message.channel.send("あなたはメンションを送信する権限を持っていません");
return;
}
非推奨