Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Внутри

-

Вопросы и ответы, обсуждения

- Ваши вопросы по C/C++ только в данном разделе

Ответ
 
Опции темы
Старый 09.01.2014, 02:19   #1
 Разведчик
Аватар для Enginerr
 
Enginerr на правильном пути
Регистрация: 20.11.2011
Сообщений: 4
Популярность: 65
Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
Отправить сообщение для Enginerr с помощью Skype™
 
По умолчанию Внутри

Вобщем кину часть кода:

int a;
a = 24001;
cout<<"Введите пароль: \n";

cin>>a;

if (a == 24001)
{

cout<<"Правильный пароль\n\n";


}

else
{
cout<<"Неправильный пароль !\n;
}


Если ввести буквы или к примеру очень большое число то программа пишет что "правильно" и начинается бесконечное повторение этого слова. В общем сбой.

Как избежать этого и сделать так чтобы кроме указанного пароля программа не реагировала ни на какой другой пароль, будь то числовое или символьное.
Возможно очень легкий и глупый вопрос, скорее так и есть...

Последний раз редактировалось Enginerr; 09.01.2014 в 02:24.
  Ответить с цитированием
Старый 09.01.2014, 04:39   #2
Подпольщик RF Online
 Пехотинец
Аватар для артём612
 
артём612 лучик света в грозовом небеартём612 лучик света в грозовом небеартём612 лучик света в грозовом небеартём612 лучик света в грозовом небеартём612 лучик света в грозовом небеартём612 лучик света в грозовом небеартём612 лучик света в грозовом небе
Регистрация: 10.10.2011
Сообщений: 65
Популярность: 772
Сказал(а) спасибо: 58
Поблагодарили 58 раз(а) в 33 сообщениях
Отправить сообщение для артём612 с помощью Skype™
 
По умолчанию Re: Внутри

Цитата:
Сообщение от EnginerrПосмотреть сообщение
Вобщем кину часть кода:

int a;
a = 24001;
cout<<"Введите пароль: \n";

cin>>a;

if (a == 24001)
{

cout<<"Правильный пароль\n\n";


}

else
{
cout<<"Неправильный пароль !\n;
}


Если ввести буквы или к примеру очень большое число то программа пишет что "правильно" и начинается бесконечное повторение этого слова. В общем сбой.

Как избежать этого и сделать так чтобы кроме указанного пароля программа не реагировала ни на какой другой пароль, будь то числовое или символьное.
Возможно очень легкий и глупый вопрос, скорее так и есть...

Вы допустили ошибку в коде поэтому при считывании данных не своего типа пароль правильный
Для этого вам надо просто убрать строку a = 24001;
Ошибка в том что вы инициализируете переменную числом равным паролю
И когда вводится в консоле данные не её типа они просто не записываются
Переменная не меняется и равна паролю....

Если же вы хотите пароль из символов

int a[10] = {0};
cout<<"Введите пароль: \n";

cin>>&a;

if (a == 'jn24001jn')
{
cout<<"Правильный пароль\n\n";
}else {
cout<<"Неправильный пароль !\n;
}
  Ответить с цитированием
Старый 09.01.2014, 10:11   #3
 Пехотинец
Аватар для twice
 
twice на правильном путиtwice на правильном пути
Регистрация: 07.07.2012
Сообщений: 60
Популярность: 171
Сказал(а) спасибо: 3
Поблагодарили 11 раз(а) в 10 сообщениях
 
По умолчанию Re: Внутри

Цитата:
Сообщение от артём612Посмотреть сообщение
int a[10] = {0};
cout<<"Введите пароль: \n";

cin>>&a;

if (a == 'jn24001jn')
{
cout<<"Правильный пароль\n\n";
}else {
cout<<"Неправильный пароль !\n;
}
___

Точнее:
Код:
std::string pas;
cin >> pas;
if (!pas.compare("your_real_password"))
{
   std::cout << "Correct!"
}
else
{
   std::cout << "Wrong password !"
}


артём612, твой код содержит 3 ошибки.
1. Фиксированный малый объем буфера под пароль дает возможность к атаке через buffer-overflow
2. В cin нужно передать просто "a", а не адрес а. Или же &a[0]
3. Сравнение строк через "==" недопустимо и не работает так, как хотелось бы. Нужно использовать функции сравнения строк.
  Ответить с цитированием
Старый 09.01.2014, 12:46   #4
 Разведчик
Аватар для Enginerr
 
Enginerr на правильном пути
Регистрация: 20.11.2011
Сообщений: 4
Популярность: 65
Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
Отправить сообщение для Enginerr с помощью Skype™
 
По умолчанию Re: Внутри

Всё заработало =)
Спасибо Артёму за разъяснение, а twice за улучшенный код.

Добавлено через 1 час 18 минут
Ещё вопрос, вот допустим мини код:

switch (a)

case1:
cout<<"Один \n";
break;

case 2:
cout<<"Два \n";
break;

default:
cout<<"Ошибка \n";
break;


Как тут защититься от переполнения буфера? Потому что у меня есть меню в программе и там аналогичное с паролем, если набрать длинные цифра или буквы то идёт сбой.

Последний раз редактировалось Enginerr; 12.01.2014 в 03:38. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 17.01.2014, 09:30   #5
 Пехотинец
Аватар для twice
 
twice на правильном путиtwice на правильном пути
Регистрация: 07.07.2012
Сообщений: 60
Популярность: 171
Сказал(а) спасибо: 3
Поблагодарили 11 раз(а) в 10 сообщениях
 
По умолчанию Re: Внутри

Цитата:
Сообщение от EnginerrПосмотреть сообщение
Всё заработало =)
Спасибо Артёму за разъяснение, а twice за улучшенный код.

Добавлено через 1 час 18 минут
Ещё вопрос, вот допустим мини код:

switch (a)

case1:
cout<<"Один \n";
break;

case 2:
cout<<"Два \n";
break;

default:
cout<<"Ошибка \n";
break;


Как тут защититься от переполнения буфера? Потому что у меня есть меню в программе и там аналогичное с паролем, если набрать длинные цифра или буквы то идёт сбой.

Тут все зависит от того, что за переменная а.
Если это строка, то данная конструкция не рабочая, надо использовать
Код:
const std::string case1 = "first";
const std::string case2 = "second";
const std::string case3 = "third";
...
std::string a;
...

if (!a.compare(case1)) //compare вернет 0 в случае совпадения строк
{
   //что-то делаем
}
else if (!a.compare(case2))
{
   //...
}
else if ...
Если а - это интегральный тип (целочисленный), то здесь единственное решение брать максимально большой тип __int64 (он же long long). Но с целочисленным можно использовать switch-case.
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Аккаунты] Внутри Anonymous1936 Халява для Читера 0 17.12.2013 20:46
внутри! andruxavipp Общение и обсуждение CrossFire 21 30.06.2011 18:32

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 13:39.

Пишите нам: forum@zhyk.ru
Copyright © 2025 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net