2015-01-17 3 views
-4

У меня есть сценарий Pay To Click, и в этом скрипте у нас есть возможность приостановить действие члена, и когда этот участник попытается войти в свою учетную запись с их именем пользователя и паролем и мгновенно нажмите кнопку входа в систему, наша система покажет ему ошибку: «Ваша учетная запись Подвеска ".Как показать пользователю приостановленную причину?

Но я хочу показать приостановленную причину для каждого пользователя. Я имею в виду, когда я приостанавливаю любого пользователя, я напишу причину, по которой он приостановлен, и после этого, когда пользователь попытается войти в свой аккаунт, наша система покажет ему ошибку (ваша учетная запись приостановлена), а затем перерыв строки, и я хочу показать ему причину.

Я уже создал столбец в таблице Участника с именем "susreason", а также я показал его на моей панели администратора для каждой опции редактирования пользователя с опцией suspend. Теперь, когда я приостановить пользователя и написать причину приостановки, то пользователь подвешенный успешно, но система не показывает причину, потому что сеанс пользователя не вошли в

Ниже приведен код, это в моем login.php:.

$username = $db->real_escape_string($input->pc['username']); 
    $password = $input->p['password']; 
    $country = ip2country($_SERVER['REMOTE_ADDR']); 
    $ip_user = $_SERVER['REMOTE_ADDR']; 
    $sect = explode(".", $ip_user); 
    $reip = ((($sect[0] . ".") . $sect[1] . ".") . $sect[2] . ".") . $sect[3]; 
    $reipa = (($sect[0] . ".") . $sect[1] . ".") . $sect[2] . ".*"; 
    $reipb = ($sect[0] . ".") . $sect[1] . ".*.*"; 
    $reipc = $sect[0] . ".*.*.*"; 
    $verifyusername = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM blacklist WHERE type='username' AND criteria='" . $username . "'")); 
    $ipban1 = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM blacklist WHERE type='ip' AND criteria='" . $reip . "'")); 
    $ipban2 = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM blacklist WHERE type='ip' AND criteria='" . $reipa . "'")); 
    $ipban3 = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM blacklist WHERE type='ip' AND criteria='" . $reipb . "'")); 
    $ipban4 = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM blacklist WHERE type='ip' AND criteria='" . $reipc . "'")); 
    $countryban = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM blacklist WHERE type='country' AND criteria='" . $country . "'")); 

    if ($verifyusername != 0) { 
     serveranswer(0, $lang['txt']['usernameblocked']); 
    } 
    else { 
     if ((($ipban1 != 0 || $ipban2 != 0) || $ipban3 != 0) || $ipban4 != 0) { 
      serveranswer(0, $lang['txt']['ipblocked']); 
     } 
     else { 
      if ($countryban != 0) { 
       serveranswer(0, $lang['txt']['countryblocked']); 
      } 
     } 
    } 

    $verifyuser = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM members WHERE username='" . $username . "'")); 

    if ($verifyuser == 0) { 
     serveranswer(0, $lang['txt']['invalidlogindetails']); 
    } 

    $user_info = $db->fetchRow(("SELECT id, username, password, status, country FROM members WHERE username='" . $username . "'")); 

    if ($user_info['password'] != md5($password)) { 
     $bid = array("user_id" => $user_info['id'], "ip" => $ip_user, "status" => "Failed", "password" => $password, "date" => TIMENOW, "agent" => (!empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : $_ENV['HTTP_USER_AGENT'])); 
     $upd = $db->insert("login_history", $bid); 
     serveranswer(0, $lang['txt']['invalidlogindetails']); 
    } 


    if ($settings['multi_login'] == "yes") { 
     $checkip = $db->fetchOne("SELECT COUNT(*) AS NUM FROM members WHERE last_ip='" . $ip_user . "' AND id!=" . $user_info['id']); 

     if ($checkip != 0) { 
      $showip_error = "yes"; 
     } 


     if ($showip_error == "yes") { 
      serveranswer(0, $lang['txt']['multipleaccountsdetected']); 
     } 
    } 


    if ($settings['multi_country'] == "yes") { 
     if ($country != $user_info['country'] && $country != "-") { 
      serveranswer(0, $lang['txt']['multiplecountrydetected']); 
     } 
    } 


    if ($user_info['status'] == "Un-verified") { 
     serveranswer(0, $lang['txt']['accountinactive']); 
    } 
    else { 
     if ($user_info['status'] == "Suspended") { 
     serveranswer(0, "<strong>Your Account has been Suspended</strong>" . "<br />" . "<div class=\"site_content\"><div class=\"info_box\"><strong>Reason of Suspend</strong>" . "<br />" . $user_info['susreason']); 
     } 
    } 

Эта строка последней строки является оператором (если), когда пользователь приостанавливается, когда система будет работать.

+0

Вы говорите, что пользователь должен войти в систему, чтобы показать причину приостановки. Но это означает, что ваша таблица пользователей может быть доступна только в том случае, если пользователь вошел в систему. Я думаю, что вы можете читать из него даже без пользовательских данных внутри сеанса, не так ли? – Giorgio

+0

'$ user_info' не приходит из сеанса - просто из поиска базы данных по имени пользователя. Сделайте некоторые отладки, чтобы понять, почему это не появляется для вас. – halfer

+0

@Giorgio я не говорю, поскольку вы говорите, что пользователь должен войти в систему, чтобы показать приостановившуюся причину. Я говорю, что мой скрипт показывает ошибку приостановки для пользователя, даже пользователь не вошел в систему, поэтому он не показывал значение " susreason "для заблокированного пользователя. –

ответ

0

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

  • Пароли хэшируются MD5. Это не было приемлемым алгоритмом хэширования в течение нескольких лет, потому что оно слишком быстро и подвержено поиску грубой силы.
  • Отсутствие хеша соления. Это делает ваши пароли восприимчивыми к поиску с радужными столами.

Вместо этого вы должны использовать password_hash(), что позволит решить обе проблемы. Это использует медленный алгоритм (Bcrypt в настоящее время), который будет увеличиваться в медленном состоянии, когда будут сделаны новые выпуски PHP (чтобы компенсировать общее увеличение производительности ЦП, затрудняя попытку грубой попытки большого количества паролей). Он также будет генерировать и хранить соль как часть хеш-выхода.

Похоже, пользователь должен получить свое имя пользователя и пароль прямо перед тем, как им сообщается о причине приостановления. Это хорошо - в большинстве случаев вы не хотите, чтобы люди определяли причины подвески, если у них просто есть имя пользователя (обычно это общедоступная информация).

+0

ваш ответ полностью против моего вопроса. Я не понимаю, о чем вы говорите. –

+0

Что вы не поняли, @JackVale? У вас есть проблемы с безопасностью, и вам хорошо знать, что они собой представляют. – halfer

+0

My Dear @halfer Я просто хочу показать причину приостановления для приостановленного пользователя, и я уже объяснил причину, когда время приостановить пользователя и значение этой причины, сохраненное в таблице (членах) в столбце (подозрение), я хочу покажите это значение столбца пользователю во время регистрации, когда мой скрипт покажет ошибку пользователю, что вы приостановлены. –