Jump to content

Recommended Posts

Posted
Только что, ZDiels сказал:

По всей видимости я не учел, что необходимо очищать результат после запроса, или что-то подобное. К сожалению сейчас не могу подсказать как решить данную проблему. Может кто-то другой сможет помочь. И скорее всего это ошибка не из-за того, что вы нажимаете ALT+TAB. Игра закрывается, скорее всего, из-за недостатка памяти.

Понятно, спасибо, ждём ещё

Posted
1 час назад, ddoommbbaass сказал:

Понятно, спасибо, ждём ещё

Похоже что в моем примере я зря постоянно завершал соединение. Нужно везде убрать connection.end();

  • Like 1
Posted
33 минуты назад, ZDiels сказал:

Похоже что в моем примере я зря постоянно завершал соединение. Нужно везде убрать connection.end();

Я думаю, лучше через файлы делать авторизацию, как в старых серверах SAMP, удобно редактировать и т.д.

Но MYSQL остается в силе...

Заранее спасибо за поддержку

Posted
В 19.01.2017 в 16:12, ddoommbbaass сказал:

Я думаю, лучше через файлы делать авторизацию, как в старых серверах SAMP, удобно редактировать и т.д.

Но MYSQL остается в силе...

Заранее спасибо за поддержку

Это древний век. Не воссоздавай зло! Учи язык!

Posted (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" то я смогу авторизовываться на твоем сервере без пароля, и это лишь малая часть, с такой реализацией любой злоумышленник может вертеть твоей БД как захочет
xD

 

 

там еще эпик фейл, ты когда чувак авторизовывается проверяешь условие на ERR, блин ERR придет пустым в случае возврата 0 строк, тоесть ты полюбас выполнишь условие под else

и еще эти отступы, корявое оформление, мои глаза....

 

http://developerslife.ru/996 

x D

Edited by cacao
  • Like 1
Posted
10 часов назад, cacao сказал:

парень ты явно не знаком с SQL инъекциями
а если я передам в args[2] строку вида 1" OR 1=1" то я смогу авторизовываться на твоем сервере без пароля, и это лишь малая часть, с такой реализацией любой злоумышленник может вертеть твоей БД как захочет
xD

 

 

там еще эпик фейл, ты когда чувак авторизовывается проверяешь условие на 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("Неверный логин или пароль");
}

Отступы выполнены обычной табуляцией. Не понимаю, почему вы решили к ним придраться. Аргументируйте.

Posted (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 by cacao
Posted
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) ...

Спасибо большое за пояснение. Рекомендации по оформлению кода обязательно приму к сведению, и буду стараться им следовать. Про плейсхолдеры уже узнал, оказалось ничего сложного в этом нет.

  • Like 1
Posted
1 час назад, ZDiels сказал:

Спасибо большое за пояснение. Рекомендации по оформлению кода обязательно приму к сведению, и буду стараться им следовать. Про плейсхолдеры уже узнал, оказалось ничего сложного в этом нет.

Друзья, есть вариант с готовым кодом и с инструкцией?

(куда как писать, как запретить без авторизации доступ в игру)

Прошу не писать об учении языка, я учу язык как могу.

Спасибо!

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...