Skip to content
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

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open

Conversation

TheKing-OfTime
Copy link
Collaborator

No description provided.

@@ -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];
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Гравис лучше заменять на обычные одинарные кавычки.
И зачем мы в конце имеем [0]?

Comment on lines -277 to +279
? `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);
Copy link
Collaborator

@ruskotwo ruskotwo Feb 6, 2023

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;

Тут ты сортируешь от максимального айдишника и лимитом забираешь лишь одну строку. Этот запрос будет в тысячи раз менее ресурсоёмким.

Comment on lines -293 to +295
? `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);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Та же история с двумя проверками и лишней константой query, которая более не будет использоваться

Copy link
Collaborator

@ruskotwo ruskotwo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Грависы поменять на одиночные кавычки, исправить описанные места

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants