ddoommbbaass Posted January 19, 2017 Author Posted January 19, 2017 Только что, ZDiels сказал: По всей видимости я не учел, что необходимо очищать результат после запроса, или что-то подобное. К сожалению сейчас не могу подсказать как решить данную проблему. Может кто-то другой сможет помочь. И скорее всего это ошибка не из-за того, что вы нажимаете ALT+TAB. Игра закрывается, скорее всего, из-за недостатка памяти. Понятно, спасибо, ждём ещё
ZDiels Posted January 19, 2017 Posted January 19, 2017 1 час назад, ddoommbbaass сказал: Понятно, спасибо, ждём ещё Похоже что в моем примере я зря постоянно завершал соединение. Нужно везде убрать connection.end(); 1
ddoommbbaass Posted January 19, 2017 Author Posted January 19, 2017 33 минуты назад, ZDiels сказал: Похоже что в моем примере я зря постоянно завершал соединение. Нужно везде убрать connection.end(); Я думаю, лучше через файлы делать авторизацию, как в старых серверах SAMP, удобно редактировать и т.д. Но MYSQL остается в силе... Заранее спасибо за поддержку
Leone Posted January 20, 2017 Posted January 20, 2017 В 19.01.2017 в 16:12, ddoommbbaass сказал: Я думаю, лучше через файлы делать авторизацию, как в старых серверах SAMP, удобно редактировать и т.д. Но MYSQL остается в силе... Заранее спасибо за поддержку Это древний век. Не воссоздавай зло! Учи язык!
cacao Posted January 20, 2017 Posted January 20, 2017 (edited) В 19.01.2017 в 14:32, ZDiels сказал: Привет! Для начала тебе необходимо установить node.js, а затем загрузить пакет для работы с mysql. Как это сделать описано здесь. После этого необходимо создать скрип, который будет заниматься регистрацией наших пользователей. Перейдем в каталог server\packages\keker\commands и создадим файл с именем database.js и поместим в него следующий код: var mysql = require('mysql'); var connection = mysql.createConnection({ //создаем подключение к БД host : 'localhost', user : 'root', password : '', database : 'WARNB' }); module.exports = //добавляем новые команды пользователей { "login": (player, args) => { if(args.length == 3){ //параметров должно быть 3 (команда, логин, пароль) connection.connect; //подключаемся к БД connection.query('SELECT * FROM `users` WHERE `login` = "' + args[1] + '" AND `password` = "' + args[2] +'";', function(err, rows, fields) { //делаем запрос if (err){ //если возникла ошибка player.outputChatBox("Ошибка входа. Попробуйте снова"); //выводим в чат сообщение об ошибке throw err; } else{ console.log(rows[0].login, ' is login'); //выводим информацию о входе в консоль player.outputChatBox("Добро пожаловать, " + rows[0].login); //выводим информацию о входе в чат игрока } }); connection.end(); //завершаем соединение } else player.outputChatBox("Используйте /login [имя пользователя] [пароль] для входа"); //если количество параметров не соответвует 3 }, "registration": (player, args) => { if(args.length == 3){ connection.connect; connection.query('INSERT INTO `users` VALUES ("' + args[1] + '", "' + args[2] + '", NOW(), "");', function(err, rows, fields) { if (err){ player.outputChatBox("Ошибка регистрации. Попробуйте снова"); throw err; } else{ player.outputChatBox("Учетная запись успешно создана!"); } }); connection.end(); } else player.outputChatBox("Используйте /registration [имя пользователя] [пароль] для регистрации"); } }; Конечно же в mysql уже должна быть создана БД и таблица users с полями login и password. Ну а при необходимости сможешь расширить ее, думаю теперь будет понятней. Вот как-то так реализовал я. Не гарантирую что это правильный подход, ведь сам тоже совсем недавно занялся программированием. Но тем не менее решил помочь) парень ты явно не знаком с SQL инъекциями а если я передам в args[2] строку вида 1" OR 1=1" то я смогу авторизовываться на твоем сервере без пароля, и это лишь малая часть, с такой реализацией любой злоумышленник может вертеть твоей БД как захочет там еще эпик фейл, ты когда чувак авторизовывается проверяешь условие на ERR, блин ERR придет пустым в случае возврата 0 строк, тоесть ты полюбас выполнишь условие под else и еще эти отступы, корявое оформление, мои глаза.... http://developerslife.ru/996 x D Edited January 20, 2017 by cacao 1
ZDiels Posted January 21, 2017 Posted January 21, 2017 10 часов назад, cacao сказал: парень ты явно не знаком с SQL инъекциями а если я передам в args[2] строку вида 1" OR 1=1" то я смогу авторизовываться на твоем сервере без пароля, и это лишь малая часть, с такой реализацией любой злоумышленник может вертеть твоей БД как захочет там еще эпик фейл, ты когда чувак авторизовывается проверяешь условие на ERR, блин ERR придет пустым в случае возврата 0 строк, тоесть ты полюбас выполнишь условие под else и еще эти отступы, корявое оформление, мои глаза.... http://developerslife.ru/996 x D Привет. Спасибо большое за критику, хоть она была и не совсем адекватна в плане формулирования. Мне почему-то показалась, что вы данным сообщением пытались показать свое превосходство над начинающим, что совсем не сложно. С SQL инъекциями я знаком, но пока не знаю как с этим бороться. Точнее я предполагаю, что необходимо фильтровать параметры, но на данном этапе обучения не знаю как это можно реализовать. Что касается ошибки с условием, то да, этого не углядел. Решается данная проблема добавлением простого условия: if (err){ //если возникла ошибка player.outputChatBox("Ошибка входа. Попробуйте снова"); //выводим в чат сообщение об ошибке throw err; } else if(rows.length > 0){ //если данная запись существует console.log(rows[0].login, ' is login'); //выводим информацию о входе в консоль player.outputChatBox("Добро пожаловать, " + rows[0].login); //выводим информацию о входе в чат игрока } else{ player.outputChatBox("Неверный логин или пароль"); } Отступы выполнены обычной табуляцией. Не понимаю, почему вы решили к ним придраться. Аргументируйте.
cacao Posted January 21, 2017 Posted January 21, 2017 (edited) 6 часов назад, ZDiels сказал: Привет. Спасибо большое за критику, хоть она была и не совсем адекватна в плане формулирования. Мне почему-то показалась, что вы данным сообщением пытались показать свое превосходство над начинающим, что совсем не сложно. С SQL инъекциями я знаком, но пока не знаю как с этим бороться. Точнее я предполагаю, что необходимо фильтровать параметры, но на данном этапе обучения не знаю как это можно реализовать. Что касается ошибки с условием, то да, этого не углядел. Решается данная проблема добавлением простого условия: if (err){ //если возникла ошибка player.outputChatBox("Ошибка входа. Попробуйте снова"); //выводим в чат сообщение об ошибке throw err; } else if(rows.length > 0){ //если данная запись существует console.log(rows[0].login, ' is login'); //выводим информацию о входе в консоль player.outputChatBox("Добро пожаловать, " + rows[0].login); //выводим информацию о входе в чат игрока } else{ player.outputChatBox("Неверный логин или пароль"); } Отступы выполнены обычной табуляцией. Не понимаю, почему вы решили к ним придраться. Аргументируйте. code style : https://learn.javascript.ru/coding-style по ссылке советы по оформлению кода, отступы, оформление фигурных скобок, название переменных функций там однако предлагают два пробела, но как по мне это на вкус извечный вопрос, что лучше - таб или 4 пробела конечно 4 пробела, пробел универсален, а вот таб может иметь разную ширину на разных платформах, в разных программах --- а не надо бороться, экранирование символов встроено по умолчанию в пакет 'mysq' синтаксис такой connection.query('SELECT name FROM Users WHERE id = ?', [id], callback) и id экранируется по дефолту но если надо самому строить запросы, то в помощь гугл с запросов "экранирование символов от SQL инъекций" ---- это конечно экономия на спичках, но тебе не обязательно высчитывать length у результата, достаточно простое условие if (rows) ... Edited January 21, 2017 by cacao
ZDiels Posted January 22, 2017 Posted January 22, 2017 20 часов назад, cacao сказал: code style : https://learn.javascript.ru/coding-style по ссылке советы по оформлению кода, отступы, оформление фигурных скобок, название переменных функций там однако предлагают два пробела, но как по мне это на вкус извечный вопрос, что лучше - таб или 4 пробела конечно 4 пробела, пробел универсален, а вот таб может иметь разную ширину на разных платформах, в разных программах --- а не надо бороться, экранирование символов встроено по умолчанию в пакет 'mysq' синтаксис такой connection.query('SELECT name FROM Users WHERE id = ?', [id], callback) и id экранируется по дефолту но если надо самому строить запросы, то в помощь гугл с запросов "экранирование символов от SQL инъекций" ---- это конечно экономия на спичках, но тебе не обязательно высчитывать length у результата, достаточно простое условие if (rows) ... Спасибо большое за пояснение. Рекомендации по оформлению кода обязательно приму к сведению, и буду стараться им следовать. Про плейсхолдеры уже узнал, оказалось ничего сложного в этом нет. 1
ddoommbbaass Posted January 22, 2017 Author Posted January 22, 2017 (edited) 123 Edited January 22, 2017 by ddoommbbaass
ddoommbbaass Posted January 22, 2017 Author Posted January 22, 2017 1 час назад, ZDiels сказал: Спасибо большое за пояснение. Рекомендации по оформлению кода обязательно приму к сведению, и буду стараться им следовать. Про плейсхолдеры уже узнал, оказалось ничего сложного в этом нет. Друзья, есть вариант с готовым кодом и с инструкцией? (куда как писать, как запретить без авторизации доступ в игру) Прошу не писать об учении языка, я учу язык как могу. Спасибо!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now