-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix db query injections #68
base: master
Are you sure you want to change the base?
Conversation
@@ -100,7 +100,7 @@ class Voice extends BaseCommand { | |||
async slash (int) { | |||
if (int.options.getSubcommand() === 'auto-sync') { | |||
await int.deferReply({ ephemeral: true }); | |||
DB.query(`UPDATE users SET mode = "${int.options.getString('mode')}" WHERE id = ${int.user.id};`)[0]; | |||
DB.query(`UPDATE users SET mode = ? WHERE id = ?;`, [int.options.getString('mode'), int.user.id])[0]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Гравис лучше заменять на обычные одинарные кавычки.
И зачем мы в конце имеем [0]
?
? `SELECT * FROM warns WHERE id = (SELECT MAX(id) FROM warns WHERE target = ${target})` | ||
? `SELECT * FROM warns WHERE id = (SELECT MAX(id) FROM warns WHERE target = ?)` | ||
: `SELECT * FROM warns WHERE id = (SELECT MAX(id) FROM warns)`; | ||
const data = DB.query(query); | ||
const data = DB.query(query, target ? [target] : undefined); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Это выглядит крайне сомнительно. По сути ты делаешь 2 проверки.
Лучше заменить сразу на что то такое:
const data = target
? DB.query('SELECT * FROM warns WHERE id = (SELECT MAX(id) FROM warns WHERE target = ?)', target)
: DB.query('SELECT * FROM warns WHERE id = (SELECT MAX(id) FROM warns)');
И сам запрос выглядит как лютый ужас. По сути, твоя задача - получить последнюю добавленную строку.
В итоге ты делаешь запрос, который содержит второй запрос, который функцией MAX находит максимальное значение и возвращает тебе.
Хотя для твоей цели подойдёт такой запрос:
SELECT * FROM warns WHERE target = ? ORDER BY id DESC LIMIT 1;
SELECT * FROM warns ORDER BY id DESC LIMIT 1;
Тут ты сортируешь от максимального айдишника и лимитом забираешь лишь одну строку. Этот запрос будет в тысячи раз менее ресурсоёмким.
? `SELECT * FROM warns WHERE NOT flags & 4 AND target = ${target}` | ||
? `SELECT * FROM warns WHERE NOT flags & 4 AND target = ?` | ||
: `SELECT * FROM warns WHERE NOT flags & 4`; | ||
const data = DB.query(query); | ||
const data = DB.query(query, target ? [target] : undefined); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Та же история с двумя проверками и лишней константой query
, которая более не будет использоваться
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Грависы поменять на одиночные кавычки, исправить описанные места
No description provided.