我知道有许多$ _SERVER变量头可用于IP地址检索.我想知道如何使用所述变量最准确地检索用户的真实IP地址(很清楚没有方法是完美的)?
我花了一些时间试图找到一个深入的解决方案,并根据许多来源提出了以下代码.我很乐意,如果有人可以请求在答案中挖洞,或者对某些事情做些准确的解释.
编辑包括来自@Alix的优化
/**
* Retrieves the best guess of the client's actual IP address.
* Takes into account numerous HTTP proxy headers due to variations
* in how different ISPs handle IP addresses in headers between hops.
*/
public function get_ip_address() {
// Check for shared internet/ISP IP
if (!empty($_SERVER['HTTP_CLIENT_IP']) && $this->validate_ip($_SERVER['HTTP_CLIENT_IP']))
return $_SERVER['HTTP_CLIENT_IP'];
// Check for IPs passing through proxies
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// Check if multiple IP addresses exist in var
$iplist = explode(',', …Run Code Online (Sandbox Code Playgroud) 我正在考虑使用TIMESTAMP存储日期+时间,但我读到它有2038年的限制.我没有大量提出我的问题,而是倾向于将其分解成小部分,以便新手用户也能轻松理解.所以我的问题:
提前致谢.
我对如何实现共享的跨域登录系统以及最佳实践和安全预防措施感兴趣.如果您熟悉37Signals,您可能习惯于使用共享通用身份验证机制,如果您使用顶级导航到其他产品,则无需随后登录.我想以类似的方式实现一些东西.
我在网上找到的最接近的东西是中央验证服务上的维基百科条目和跨域登录的响应- 如何在从一个域转移到另一个域时自动登录用户,在这种情况下可能略有不同.
我已经检查了他们的会话cookie,以便掌握他们在此过程中所做的工作.最初,每个产品链接都有一个"goto"uristub,即:
https://MY_COMPANY.campfirenow.com/id/users/[int_identifier]/goto
使用FireCookie和Firebug中的NET选项卡,我能够看到设置的cookie以及过程中出现的重定向.该gotourl触发302重定向到:
https://MY_COMPANY.basecamphq.com/login/authenticate?sig=[BASE64_ENCODED_AND_ENCRYPTED_DATA]
重新创建会话标识符,最有可能用于CSRF目的.使用base64_decode对cookie中的一些数据以及GET参数sig进行部分解密,如下所示:
// sig GET param
array(2) {
[0]=>
?????:@marshal_with_utc_coercionT7?z??<k??kW"
[1]=>
string(18) "???k?<kn8?f???to??"
}
// _basecamp_session cookie session param
string(247) {
:_csrf_token"1Sj5D6jCwJKIxkZ6oroy7o/mYUqr4R5Ca34cOPNigqkw=:session_id"%060c0804a5d06dafd1c5b3349815d863"
flashIC:'ActionController::Flash::FlashHash{:
@used{: auth{"
MY_COMPANY{:
user_idi?3
:identity_idi?W??????????s?]??:?N[??:
Run Code Online (Sandbox Code Playgroud)
߾"
编码打破了代码块.谢谢你的帮助!
我承认,我没有经过单元测试......但我想.话虽如此,我有一个非常复杂的注册过程,我想优化,以便更容易进行单元测试.我正在寻找一种方法来构建我的类,以便将来可以更轻松地测试它们.所有这些逻辑都包含在MVC框架中,因此您可以假设控制器是从中实例化所有内容的根.
为了简化,我实际上要问的是如何设置一个系统,您可以使用CRUD更新管理任意数量的第三方模块.这些第三方模块都是RESTful API驱动的,响应数据存储在本地副本中.删除用户帐户之类的东西需要触发删除所有相关模块(我称之为提供者).这些提供者可能依赖于另一个提供者,因此删除/创建的顺序很重要.我对我应该专门用来支持我的应用程序的设计模式感兴趣.
注册跨越多个类并将数据存储在多个db表中.这是不同提供者和方法的顺序(它们不是静态的,只是为了简洁起见):
Provider::create('external::create-user')在特定提供商的特定步骤启动注册.第一个参数中的双冒号语法表示该类应该触发创建providerClass::providerMethod.我提出了一个一般假定Provider将与方法的接口create(),update(),delete()所有其他供应商将实现它.如何实例化这可能是你需要帮助我的东西.$user = Provider_External::createUser() 在外部API上创建用户,返回成功,用户存储在我的数据库中.$customer = Provider_Gapps_Customer::create($user) 在第三方API上创建客户,返回成功并在本地存储.$subscription = Provider_Gapps_Subscription::create($customer) 在第三方API上创建与先前创建的客户关联的订阅,返回成功并在本地存储.Provider_Gapps_Verification::get($customer, $subscription)从外部API检索行.该信息存储在本地.另一个电话是我正在跳过以保持简洁.Provider_Gapps_Verification::verify($customer, $subscription)执行外部API验证过程.其结果存储在本地.这是一个非常愚蠢的样本,因为实际代码依赖于至少6个外部API调用和10个本地数据库行在注册期间创建.在构造函数级别使用依赖注入是没有意义的,因为我可能需要在控制器中实例化6个类,而不知道我是否甚至需要它们.我想要完成的事情就像Provider::create('external')我只是指定启动注册的起始步骤.
如您所见,这只是注册过程的一个示例.我正在构建一个系统,我可以拥有数百个服务提供商(外部API模块),我需要注册,更新,删除等.这些提供商中的每一个都与用户帐户相关联.
我想以一种方式构建这个系统,我可以在触发创建新提供程序时指定操作顺序(步骤).换句话说,允许我指定在事件链中接下来触发哪个提供者/方法组合,因为创建可以跨越这么多步骤.目前,我通过主题/观察者模式发生了这一系列事件.我希望可能将此代码移动到数据库表,provider_steps在此列出每个步骤以及它的跟随success_step和failure_step(对于回滚和删除).该表如下所示:
# the id of the parent provider row
provider_id int(11) unsigned primary key,
# the short, slug name of the step for using in codebase
step_name varchar(60), …Run Code Online (Sandbox Code Playgroud) 例如,用户可能仅基于总体用户群的百分比(10%).部署应该是可自定义的(可配置的)并支持任意数量的功能.将转出关联到特定用户角色或特权(ACL)也很有用.
那么,从本质上讲,什么是可以合理扩展的架构?
至于语言不可知部分,您可以提供伪代码,一般概念或想法,或者使用您首选语言的片段来表达您的观点.
欢迎链接到任何示例或教程.
许多框架spl_autoload_register()用于动态加载类(即控制器和模型).关于自动加载和操作码缓存的问题有几篇文章.特别是一个帖子有@cletus的响应,它引用了@Rasmus做了一些声明,这些声明对于那些利用APC作为操作码缓存的人来说是不利的:
对于不影响操作码缓存性能的任何可能的自动加载替代方案似乎没有任何讨论.
有没有办法解决自动加载类没有添加到字节码缓存的事实?
如果没有,是否有任何替代方法可以动态加载将被缓存的类?
在OSX上的最新Chrome浏览器中,我注意到开始输入评论框并点击其他链接或按后退按钮会触发一个确认窗口,询问我是否要离开:

作为一名老学校开发人员,我相信唯一的可能性就是将一个onbeforeunload事件附加到页面来处理后退按钮点击.我知道你可以对锚点进行全局绑定来模拟onbeforeunload,但我很惊讶他们设法有一个自定义样式的确认而不是股票,丑陋的确认对话框.
他们是如何做到的呢?这是某种HTML5窗口历史记录还是pushState事件触发器?
所以我一直在开发使用get_option函数创建交互和删除数据库的插件.
我现在看到一些教程展示如何使用全局$ wpdb方式从数据库中获取值.
两者之间有什么区别,哪一个比另一个好?
我最近在Scribd的一个演示文稿中读到,Facebook已经为APC的各种锁定机制进行了基准测试,包括文件锁(默认),IPC信号量锁,linux Futex锁,pthread互斥锁和自旋锁.您可以通过单击以下链接查看此演示文稿:APC @Facebook
我想知道是否有人知道这个源代码是否已经发布,可能是在某个地方的git或SVN存储库中?从默认文件锁定切换到其他选项之一的速度优势似乎很重要.
我有一个包含5个步骤的多步骤表格.我希望用户能够使用回车键提交每个子表单以触发验证并在成功时转到下一个子表单.我找不到办法做到这一点.我想也许我可以ng-keydown为每个子表单添加事件(或绑定到自定义指令onkeydown)并监视回车键keyCode.
有没有人有使用Angular的工作经验?你会如何添加此功能?
这是子表单的简短HTML示例.假设"下一步"按钮$scope.nextStep()在角度控制器内触发,并随后执行验证以确定用户是否可以移动到下一步或者是否显示验证错误.
<form>
<div ng-form="step1"></div>
<div ng-form="step2"></div>
<div ng-form="step3"></div>
<div ng-form="step4"></div>
<div ng-form="step5"></div>
<button type="button" class="btn" ng-click="nextStep()">Next Step</button>
</form>
Run Code Online (Sandbox Code Playgroud)
对于那些阅读和寻找答案的更多信息的人
我跟踪控制器内部的表单步骤$scope.current_step.使用它,我可以$scope[$scope.current_step]用来引用当前的表单.有了@Vova接受的答案,我会做类似以下的事情:
$scope.myFunc = function(event) {
if (!$scope.isFormValid()) {
return false;
}
// trigger next step (which handles it's own validation)
$scope.nextStep();
};
$scope.isFormValid = function() {
// check if the current form is invalid
if ($scope[$scope.current_step].$pristine
|| $scope[$scope.current_step].$invalid
) {
return false;
}
return true;
};
Run Code Online (Sandbox Code Playgroud) 我有一个函数,使用返回日期字符串Zend_Date.
$date = new Zend_Date();
$date->setOptions(array('format_type' => 'php'));
$date->setTimestamp($timestamp);
return $date->toString($format);
Run Code Online (Sandbox Code Playgroud)
当我设置$format为'l, d F Y'我期望类似:
?roda, 13 stycznia 2010(正确的抛光字符串是什么意思Wedneseday, 13 january 2010),它的效果很好.
但是当我在浏览器中将语言环境设置为英语时打开此页面时,它会返回英语中的日期字符串而不是我希望看到的波兰语.
无论浏览器设置如何,我应该设置什么以及在哪里获得始终抛光日期?
php ×7
angularjs ×1
apc ×1
autoload ×1
autologin ×1
caching ×1
cookies ×1
dependencies ×1
deployment ×1
facebook ×1
frameworks ×1
ip-address ×1
javascript ×1
keypress ×1
limited-user ×1
locking ×1
login ×1
modal-dialog ×1
mysql ×1
oop ×1
opcode-cache ×1
rollout ×1
session ×1
shared ×1
translation ×1
unit-testing ×1
wordpress ×1
year2038 ×1
zend-date ×1