对于学习的原因,试图给登录访问只为一个设备 所以我加了用户表内的新行中的数据库称为IP其中存储的注册用户的IP,然后例如我做了什么这样登录表单如何给只能访问一台设备
if($user->ip == $myip){ echo 'success'; }
这里的问题是IP改变这样的形式不能让我的访问,或记录, 所以我的问题反正是有记录在仅使用一台设备不使用IP?
对于学习的原因,试图给登录访问只为一个设备 所以我加了用户表内的新行中的数据库称为IP其中存储的注册用户的IP,然后例如我做了什么这样登录表单如何给只能访问一台设备
if($user->ip == $myip){ echo 'success'; }
这里的问题是IP改变这样的形式不能让我的访问,或记录, 所以我的问题反正是有记录在仅使用一台设备不使用IP?
不是最好的解决办法:
公网IP的是动态的,重新启动路由器时,意思是 - 他们获得新的IP地址。是的,你永远不能重新启动路由器,但你无法保护电力意味着检查,断电等物理事情。
这里最好的办法是让这个软件从你想要的节点之外不可访问能够与之交互。意思是说,使用Apache和MySQL(如XAMPP)并只在该节点上运行它。
如果您正在寻找能够添加IP的长期解决方案,请使用共享网络。或者实现安全约定,如认证(登录)。
但是,如果你想从你的角度来构建它:使用$_SERVER
超级变量来访问当前的IP,你需要知道它在访问之前(因此找到它像what is my ip
if($_SERVER['SERVER_ADDR'] == $somePreknownIp) {
// authorised
}
我会建议使用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;
}
如果你有动态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,因此他们尝试直接访问登录表单。然后,该登录表单将不会显示给他们。
虽然使用会话变量来跟踪谁登录是一个很好的想法,但这个特定的解决方案非常糟糕。依靠每个人不知道可公开访问的文件注定会失败。如果它可用,它将被发现,并且当它被发现时将被滥用。 – ChristianF
编辑:
,在重读我看到,我误解了什么OP是真的要求的问题。留下我原来的回复,以防其他人发现它有用。
这个问题的正确答案是:为什么要关心谁能看到登录表单?只需使用适当强大的密码,以及防止蛮力企图(节流限制)的正确技术。
添加到此脚本的任何密钥或类似信息毕竟只是另一个密码。来自您的连接,浏览器或任何其他信息的任何其他信息都可能被攻击者嗅探和欺骗(或者出于任何原因,甚至从您下方更改)。
如果你有一个静态IP,并且想要让任何潜在的黑客破解你的密码更困难一点,那么限制到一个(或一系列)IP是非常有用的。
它不是一个好密码的替代品。
原来的答复:
这实际上是一个相当普遍的问题,并解决了好几次。虽然实施解决方案需要一些工作,但它非常简单。
首先,您需要创建一个表来跟踪每个用户的会话。此表只需要两个(或三个)字段:
,因为它不是必需的,可以省略时间戳,但它可能是很高兴有调试/记录的目的。
一旦你有了,你需要重新编写你的登录脚本。因此,它首先检查用户是否已经有任何活动会话,如果他们没有创建新会话并将其ID存储在上述表中。
然而,如果用户确实有一个会话活跃不已,那么你需要做两件事情之一:
在这两种方法中,我更喜欢后者,因为第一种方法会导致用户意外地将自己锁定在系统外面。直到您作为管理员进入并手动删除旧会话。
第二种方法将需要更多的工作,以删除/无效旧会话,但通常更健壮。它也会给用户带来最少的惊喜,因为他们希望在尝试这样做时登录。他们不必去追逐任何单位,他们认为他们用最后登录。
如果您决定使用方法1,则可以执行的另一件事是记录时间戳,然后将此与最大会话生存期结合使用。如果time_now - max_session_lifetime > timestamp
那么你知道会话是旧的,并且可以自动删除。确保用户最终能够登录,而不必依赖查找/获取旧单元,或者手动删除它。
我将不会发布任何代码这一点,原因有二:
但是,按照我的逻辑,设置一个伪代码/流程图,它应该很容易实现。
有一件事进入我的脑海。 如果您知道他的电话号码,请发送带有令牌的短信登录。 当然有关于发送短信的技术问题,我作为新手无法解决...
您可以使用Mobile-Detect
php库并获取特定设备的设备信息,并可以在db中添加设备详细信息,然后您可以对该特定设备进行检查。
图书馆正式文件是在这里 - Mobile-Detect
并为使用去这里 - Usage example
有一个也是客户端 - mobile-detect.js
希望这将帮助你一些方法(Y) 。
您可以将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';
}
优点:
$accessCode
和$whitelsit
更改为这已经得到了访问缺点阻止用户:如果有些用户被列入白名单的IP
$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
即可。
万一'如果某些用户获得白名单IP,他将获得访问权限'是必需的,您可以改进方法。例如,一段时间后,当用户获取他的第一个cookie时,不要仅通过IP地址授予访问权限或在数据库中保存时间戳,并且不要通过IP地址授予访问权限。 – rNix
您必须使用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,让他们进来,但是,如果他们没有,我不知道你要做什么,但也许这是什么你神秘地试图在这里学习。
可能最好使用传统密码 –
以及如何使表单从一个设备访问??? –
你为什么想要? – 2016-11-20 03:17:25