2016-11-20 173 views
-2

对于学习的原因,试图给登录访问只为一个设备 所以我加了用户表内的新行中的数据库称为IP其中存储的注册用户的IP,然后例如我做了什么这样登录表单如何给只能访问一台设备

if($user->ip == $myip){ echo 'success'; } 

这里的问题是IP改变这样的形式不能让我的访问,或记录, 所以我的问题反正是有记录在仅使用一台设备不使用IP?

+0

可能最好使用传统密码 –

+0

以及如何使表单从一个设备访问??? –

+0

你为什么想要? – 2016-11-20 03:17:25

回答

4

修复IP地址可能无法实现。有许多其他方法可以实现您的目标,从廉价和简单到非常复杂和昂贵。这里有一对夫妇。

  • 使用USB按键(如this one),只需按一个按钮即可输入强密码。

  • 使用双向SSL(见question),安全的,但复杂的

  • 最简单的这些选项(以及我的建议)是设定一个长期居住的cookie(使用浏览器开发者工具栏或扩展),并检查在PHP中存在的cookie在$_COOKIE array

祝你好运!

0

不是最好的解决办法:

公网IP的是动态的,重新启动路由器时,意思是 - 他们获得新的IP地址。是的,你永远不能重新启动路由器,但你无法保护电力意味着检查,断电等物理事情。

这里最好的办法是让这个软件从你想要的节点之外不可访问能够与之交互。意思是说,使用Apache和MySQL(如XAMPP)并只在该节点上运行它。

如果您正在寻找能够添加IP的长期解决方案,请使用共享网络。或者实现安全约定,如认证(登录)。

但是,如果你想从你的角度来构建它:使用$_SERVER超级变量来访问当前的IP,你需要知道它在访问之前(因此找到它像what is my ip

if($_SERVER['SERVER_ADDR'] == $somePreknownIp) { 
    // authorised 
} 
0

我会建议使用cookie而不是首先添加以下代码:。

If ($user -> me) { 
setcookie("HeyItsMe", 'SomeReallyHardToGuessValue', time()+3600*24*365); /* this would expire in 1 year */ 
} 

因为你登录这将设置cookie只是你之后,你可以摆脱代码并添加foll由于您的登录屏幕:

if (isset($_COOKIE['HeyItsMe']) && $_COOKIE['HeyItsMe']== 'SomeReallyHardToGuessValue') { 
/**show them the login screen **/ 
} else { 
    exit; 
} 
+0

'$ user-> me'是如何设置的?如果有外部**访问此软件,每个人都将被认证。这个答案没有意义 – KDOT

+0

@KDOT我假设$用户 - >我暗示他已登录... – Eric

+0

OP声称他不使用这个,他的问题是IP更改并添加一个cookie不会永远持续下去 – KDOT

0

如果你有动态IP,那么你不能使用IP地址。因此,我建议你使用会话。

为此,您必须在根文件夹(项目文件夹)中创建另一个PHP文件。 并且不要与其他人共享那个文件名。 (我命名该文件作为loginHandler.php)

loginHandler.php文件有以下内容。

<?php 
session_start(); 
// assign value to loginHandler. 
$_SESSION['loginHandler'] = "99"; 
// redirect to login page 
header('Location: login.php'); 
?> 

在您的登录页面(login.php中),你必须页面起始会话顶部。如果设置了$_SESSION['loginHandler'],则会显示您的登录表单。否则,它将只显示其余内容。

<?php session_start(); ?> 
<p>Page Content</p> 

<?php if(isset($_SESSION['loginHandler'])): ?> 
    <div id="loginBlock"> 
     <form method="post" action=""> 
      <p>Your Login Form</p> 
     </form> 
    </div> 
<?php endif ?> 

<p>Page Content</p> 

如果您想登录。那么首先你必须访问loginHandler.php文件。然后你将被重定向到login.php页面。你可以访问登录表单。

但其他人不知道关于loginHandler.php,因此他们尝试直接访问登录表单。然后,该登录表单将不会显示给他们。

+1

虽然使用会话变量来跟踪谁登录是一个很好的想法,但这个特定的解决方案非常糟糕。依靠每个人不知道可公开访问的文件注定会失败。如果它可用,它将被发现,并且当它被发现时将被滥用。 – ChristianF

0

编辑:

,在重读我看到,我误解了什么OP是真的要求的问题。留下我原来的回复,以防其他人发现它有用。

这个问题的正确答案是:为什么要关心谁能看到登录表单?只需使用适当强大的密码,以及防止蛮力企图(节流限制)的正确技术。

添加到此脚本的任何密钥或类似信息毕竟只是另一个密码。来自您的连接,浏览器或任何其他信息的任何其他信息都可能被攻击者嗅探和欺骗(或者出于任何原因,甚至从您下方更改)。

如果你有一个静态IP,并且想要让任何潜在的黑客破解你的密码更困难一点,那么限制到一个(或一系列)IP是非常有用的。
它不是一个好密码的替代品。


原来的答复:

这实际上是一个相当普遍的问题,并解决了好几次。虽然实施解决方案需要一些工作,但它非常简单。

首先,您需要创建一个表来跟踪每个用户的会话。此表只需要两个(或三个)字段:

  • 用户ID
  • 会话ID
  • (时间戳)

,因为它不是必需的,可以省略时间戳,但它可能是很高兴有调试/记录的目的。

一旦你有了,你需要重新编写你的登录脚本。因此,它首先检查用户是否已经有任何活动会话,如果他们没有创建新会话并将其ID存储在上述表中。
然而,如果用户确实有一个会话活跃不已,那么你需要做两件事情之一:

  • 如果要禁止任何进一步的登录,简单地返回一个错误解释说,他们已经登录
  • 或者,删除旧会话,然后将它们登录到新设备上。

在这两种方法中,我更喜欢后者,因为第一种方法会导致用户意外地将自己锁定在系统外面。直到您作为管理员进入并手动删除旧会话。
第二种方法将需要更多的工作,以删除/无效旧会话,但通常更健壮。它也会给用户带来最少的惊喜,因为他们希望在尝试这样做时登录。他们不必去追逐任何单位,他们认为他们用最后登录。

如果您决定使用方法1,则可以执行的另一件事是记录时间戳,然后将此与最大会话生存期结合使用。如果time_now - max_session_lifetime > timestamp那么你知道会话是旧的,并且可以自动删除。确保用户最终能够登录,而不必依赖查找/获取旧单元,或者手动删除它。

我将不会发布任何代码这一点,原因有二:

  1. 您还没有张贴在您办理登录的代码,使它不可能对我提出任何具体变化。
  2. 这些变化需要在很多地方完成,并且需要重新设计您的逻辑。

但是,按照我的逻辑,设置一个伪代码/流程图,它应该很容易实现。

0

有一件事进入我的脑海。 如果您知道他的电话号码,请发送带有令牌的短信登录。 当然有关于发送短信的技术问题,我作为新手无法解决...

0

您可以使用Mobile-Detect php库并获取特定设备的设备信息,并可以在db中添加设备详细信息,然后您可以对该特定设备进行检查。

图书馆正式文件是在这里 - Mobile-Detect

并为使用去这里 - Usage example

有一个也是客户端 - mobile-detect.js

希望这将帮助你一些方法(Y) 。

0

您可以将2种方法合并为一种。你有一个3个IP地址的列表。例如:

$whitelist = [ 
    '192.168.1.2', 
    '192.168.1.3', 
    '192.168.1.4', 
]; 

那么你应该检查地址或饼干:

$accessCode = 'Xvj482Sfjfi2Ghj23PoqT'; //some random string 
$cookieExpireValue = time() + 3600 * 24 * 365 * 3; //3 years 

$isIpValid = ($_SERVER['REMOTE_ADDR'] && in_array($_SERVER['REMOTE_ADDR'], $whitelist, true)); 
$isCookieSet = (isset($_COOKIES['access_code']) && $_COOKIES['access_code'] === $accessCode); 

if ($isIpValid || $isCookieSet) { 
    setcookie("access_code", $accessCode, $cookieExpireValue); 
    echo 'success'; 
} 

优点:

  • 它限制访问
  • 如果IP地址改变,用户有3种访问年
  • 您可以将$accessCode$whitelsit更改为这已经得到了访问
  • 简单

缺点阻止用户:如果有些用户被列入白名单的IP

  • ,他会如果用户丢失该Cookie(重新安装操作系统,浏览器可以访问
  • 干净等),他将失去访问权限(只需更改$whitelist

如果您有不同的用户名称,对于每一个装置S的记录,你限制表单提交后访问,可以为用户省去了新的IP地址,如果用户有一个有效的cookie:

if ($isIpValid || $isCookieSet) { 
    setcookie("access_code", $accessCode, $cookieExpireValue); 
    $user->ip = $_SERVER['REMOTE_ADDR']; 
    $user->save(); 
    echo 'success'; 
} 

和更改验证:

$isIpValid = ($_SERVER['REMOTE_ADDR'] && (in_array($_SERVER['REMOTE_ADDR'], $whitelist, true) || $user->ip === $_SERVER['REMOTE_ADDR'])); 

在这种情况下,您可以摆脱地址白名单,只需为每个白名单用户设置ip即可。

+0

万一'如果某些用户获得白名单IP,他将获得访问权限'是必需的,您可以改进方法。例如,一段时间后,当用户获取他的第一个cookie时,不要仅通过IP地址授予访问权限或在数据库中保存时间戳,并且不要通过IP地址授予访问权限。 – rNix

0

您必须使用cookie,并且如果设置了cookie,则不得允许新的登录。

下列专家和接受的解决办法达成一致:

how to identify remote machine uniquely in php?' 接受的解决方案:通过cookie的唯一标识的计算机

Uniquely identify one computer 接受的解决方案:设置必须存在于未来的登录cookie中

How to uniquely identify a computer? 接受的解决方案:解决方案讨论Evercookie但点好像是你需要一个cookie

因此,总而言之,如果用户有一个cookie,让他们进来,但是,如果他们没有,我不知道你要做什么,但也许这是什么你神秘地试图在这里学习。

相关问题