4

我在保留变量时遇到问题。我猜当您提交表单时,变量将被重置为默认值。所以我不知道如何在它说“走开!黑客!”之前限制 3 次登录尝试。仅使用 php,仅此而已。有人有线索吗?不要担心安全性,因为这只是我的教授给我们的练习示例,我们只需要单独使用 php 即可。所以不用担心黑客重置cookies。

注意:我只使用 XAMPP 使 php 在 localhost 中工作。

这是PHP中的代码:

<center><form action="" method="post"><br>
User ID: <input type="text" name="id"><br>
Password: <input type="password" name="pass"><br>
<input type="submit" name="submit" value="login">
</form>

<?php
if(isset($_POST['submit'])){
    $counter = 0;
    $counter++;
    $vid = 'hanzo';
    $vpass = '123456';
    $id = $_POST['id'];
    $pass = $_POST['pass'];
    $c = "<center>";
    if(empty($id)) echo "$c Please Input Username.<br>";
    else if(empty($pass)) echo "$c Please Input Password.<br>";
    else if($vid==$id && $vpass==$pass) echo "$c Login Succesfully<br>";    
    else if($counter>3) echo "$c Go Away! Hacker!<br>";
    else echo "$c Invalid Username/Password<br> Login Attempt: $counter";
}
?>
4

8 回答 8

4

您可以在会话中粘贴变量,以便通过多个页面加载为用户/客户端计算机保留它们。http://us3.php.net/manual/en/intro.session.php

每次您的脚本运行时,它都会从一张白纸开始。除了魔术 $_X 变量之外,所有变量都是未定义的。您需要将您自己的任何数据放在可以通过多次运行持续存在的位置——会话、cookie、数据库、文本文件等。

会话可能是最简单的方法。由于它们具有客户端元素,因此它们并不完全安全。相对成熟的用户可以绕过会话检查。

于 2012-07-17T14:26:55.127 回答
1

尝试使用

<input type='hidden' />

不会真正阻止一个坚定的黑客,但如果您对它们有特殊的厌恶,您可以使用它来存储页面之间的变量而无需启用会话。

否则

session_start();  
if (isset($_SESSION['loginCount']))
{
   $_SESSION['loginCount']++;
   if ($_SESSION['loginCount'] > 3)
   {
     echo 'Bog Off!';
     exit;
   }
} else {
   $_SESSION['loginCount'] = 1;
}

这会更好,但请注意,如果您的黑客清除了他们的浏览器缓存,会话将被重置。最好的办法是在数据库中跟踪源 IP 地址,但即使这样也可以使用代理解决。

于 2012-07-17T14:34:00.973 回答
0

您可以使用会话并将登录信息保存到这些会话中。

if(!isset($_SESSION['logonCounter'])) {
    $_SESSION['LogonCounter'] = 0;
}

if($LogonFail == true) { // do something that check if its correct
    $_SESSION['LogonCounter']++;
}

if($_SESSION['LogonCounter'] < 3) {
    // Do something
}
于 2012-07-17T14:27:48.317 回答
0

将计数器保存在 SESSION 中,并在每次登录失败时增加其值。否则,您可以在数据库中创建一个表,并将登录尝试与用户的 IP 地址保持在同一行中。如果需要,使用第二种方法可以永久阻止某些 IP ...

希望这可以帮助

于 2012-07-17T14:27:52.647 回答
0

就我个人而言,我会使用一个数据库,以便您可以看到正在发生的事情,并且黑客不容易避免,但是仅使用 php,您可以将登录尝试次数存储在会话变量中:

<?php
// only check on posts
if ($_SERVER['REQUEST_METHOD'] === 'POST')
{
  session_start();
  $_SESSION['login_attempts'] = isset($_SESSION['login_attempts']) ? ($_SESSION['login_attempts'] + 1) : 0;
  // do checking on number of attempts
  if ($_SESSION['login_attempts'] > 3)
  {
    echo "Go Away! Hacker!";
    die();
    // or just do a redirect to another page...
  }
}
?>
<center><form action="" method="post"><br>
...
于 2012-07-17T14:28:53.300 回答
0
if(isset($_SESSION['attempts']))
{
    if ($_SESSION['attempts'] == 3){
        echo "Go away!";
    } else {
      $_SESSION['attempts']=$_SESSION['attempts']+1;
    }
}
else
{
  $_SESSION['attempts']=0;
}
于 2012-07-17T14:28:57.933 回答
0

您可能最好通过会话来执行此操作,以实现简单的实现。但是,用户可以通过删除会话 cookie 轻松终止他们的会话。真正最安全的方法是按 IP 地址将所有登录请求记录到数据库,然后如果您在 Y 时间内从给定 IP 地址收到 X 个失败请求,则显示安全警告。

于 2012-07-17T14:29:00.017 回答
0

您可以将其存储在其中,$_SESSION但它不可靠,因为他们可以简单地继续重置会话 cookie。我建议您使用memcacheapc_store根据您运行的 IP 地址来识别和识别。

于 2012-07-17T14:26:35.557 回答