我遇到了以下问题。我无法使用手机登录我的系统。当我使用手机时,有4个IP地址的结尾范围,因此系统/ libraries / Session.php第192行IP匹配对于整个功能sess_read()返回FALSE,因此我无法从手机登录。
但奇怪的是,当我向朋友展示我的应用程序时,我能够在2周左右登录。我的电脑一切正常。唯一的问题是传入的IP必须与DB IP相同。
你们有没有遇到过这个?我使用最新的codeigniter版本2.1.3。我不想将任何东西硬编码到Session.php,因为它是一个核心库。
谢谢,Jakub
答案 0 :(得分:0)
设置$config['sess_match_ip'] = FALSE;
如果手机正在更改IP,则它不受CI的控制。
如果您必须启用sess_match_ip,您可以选择在配置文件中添加一些逻辑,以便根据具体情况将sess_match_ip设置为true / false。
$config['sess_match_ip'] = has_changing_ips();
function has_changing_ips()
{
/**
* Code to return true if normal or
* return false if phone or other device with changing IPs
*/
}
答案 1 :(得分:0)
好的,我已经为app / config / config.php写了这个函数:
$config['sess_match_ip'] = match_ip(3);
// $range sets -+ of the last numbers
function match_ip ($range){
session_start();
$IP = $_SERVER['REMOTE_ADDR'];
$IP_parts = explode(".", $IP);
if (isset($_SESSION['mi'])){
//If the last part is the same, match IP
if ($_SESSION['mi'] == $IP_parts['3']){
return TRUE; // SAME IP doesn't cause the problem, therefore TRUE
}
// If the last ending($_S[mi]) is +- 3, IP is dynamic, therefore FALSE
if (($IP_parts['3']-$range <= $_SESSION['mi']) && ($_SESSION['mi'] <= $IP_parts['3']+$range)) {
return FALSE;
}
else{
return TRUE;
}
}
// If session not set, set it.
else{
$_SESSION['mi'] = $IP_parts['3'];
}
}
我知道ip6v的问题,但就我的目的而言,这应该有效。关于安全性 - 在一天结束时,我将一些东西存储在一个未加密的会话中。但是IP地址真的很容易伪造,因此如果有人试图破解你的会话,即使[&#39; sess_match_ip&#39;] = TRUE也不重要。但我喜欢这个功能。
如果您想使用此代码,请进一步研究$ range的范围。我的手机电话范围是+ -2。但实际范围可能不同。如果您发现,请在此处发布。