好吧,我有一个小的身份验证问题.我的Web服务允许使用用户名和密码通过HTTP连接到我的API,但此连接也可以限制为特定的IP地址.
这意味着$_SERVER['REMOTE_ADDR']可能不正确.我已经知道任何IP信息都无法真正依赖 - 我只有在尝试添加另一层安全性时才有限制.
如果这是对我的Web服务器的请求的一般概述:
clientSERVER => clientPROXY => myPROXY => mySERVER
那么这意味着mySERVER显示REMOTE_ADDRmyPROXY而不是客户端的myPERVX,并将客户端的实际IP发送为HTTP_X_FORWARDED_FOR.
为了解决这个问题,我的Web服务有一个"可信代理"IP地址列表,如果REMOTE_ADDR是来自其中一个可信IP地址,那么它告诉我的Web服务实际的IP地址是值HTTP_X_FORWARDED_FOR.
现在问题出在clientPROXY上.这意味着(通常)mySERVER获取HTTP_X_FORWARDED_FOR具有多个IP地址的值.根据HTTP_X_FORWARDED_FOR文档,该值是以逗号分隔的IP地址列表,其中第一个IP是实际真实客户端的IP,而每个其他IP地址是代理的IP地址.
因此,如果HTTP_X_FORWARDED_FOR有多个值并且我的服务是IP限制的,我是否必须检查HTTP_X_FORWARDED_FOR针对我允许的IP列表的"最后"值并忽略实际的客户端IP?
我假设在一个系统中,我必须设置允许的IP地址列表,白名单IP地址应该是代理的IP地址而不是代理后面的IP(因为那可能是一些本地主机IP并经常更改) .
那是什么HTTP_CLIENT_IP?
如何最小化我的请求的cookie大小?Chrome似乎在"警告我"我的饼干大小是41B,这根本不是很多,但它是否有理由警告我呢?
它是一个PHPSESSID cookie,我真的不知道如何最小化.有任何想法吗?
我的请求响应本身应该已经是Gzip,但据我所知,不可能自己压缩标题,或者是否存在?
谢谢!我只是一个关于性能和审核的OCD,告诉我我可以做得更好.
我将翻译存储在我的系统中的INI文件中,并以这种方式存储:
$ini=parse_ini_file('translations.ini',false,INI_SCANNER_RAW);
Run Code Online (Sandbox Code Playgroud)
根据文档,这个INI_SCANNER_RAW设置告诉PHP:
如果提供了INI_SCANNER_RAW,则不会解析选项值.
从技术上讲,这意味着它不应该使用INI文件中的值进行任何解析,因此我不必在INI文件中引用或转义任何内容.这一切都有效:
example1="one"
example2=one
example1='one'
example3="double quotes ("value")"
example4=double quotes ("value")
example3='double quotes ("value")'
Run Code Online (Sandbox Code Playgroud)
它们将输出为:
one
one
one
double quotes ("value")
double quotes ("value")
double quotes ("value")
Run Code Online (Sandbox Code Playgroud)
即便如此:
semi-colon1="?1234567890+´õü'äö-.,<>~:_ÖÄ*PÕÜ`?=)(/&%¤#"!@£$€{[]}\½"
Run Code Online (Sandbox Code Playgroud)
哪些输出可预测:
?1234567890+´õü'äö-.,<>~:_ÖÄ*PÕÜ`?=)(/&%¤#"!@£$€{[]}\½
Run Code Online (Sandbox Code Playgroud)
但这是一个问题.在我为INI值添加分号(;)的那一刻,即使我试图逃避它,我的解析也会中断.
example1="semi-colon looks like (;) character"
example1="semi-colon looks like (\;) character"
example1="semi-colon looks like (\\;) character"
example1="semi-colon looks like (\\\;) character"
Run Code Online (Sandbox Code Playgroud)
所有的输出是:
"semi-colon looks like (
"semi-colon looks like (
"semi-colon looks like (
"semi-colon looks like (
Run Code Online (Sandbox Code Playgroud)
(如果我使用单引号而不是双引号,情况也是如此)
我最好的猜测是,这是因为分号被认为是评论的一个字符,所以它被删除了,它留下了这段文字.起始引号保留在那里,因为结尾引号在分号后面,因此它不是封装的.
但这没有多大意义,因为#也被认为是INI文件的注释符号.
但这对我的系统来说是一个非常严重的问题,如何在INI文件中的值字符串中使用分号?这是PHP中的错误还是预期的行为?
这不会引发异常或通知或错误.
谢谢!
是否有可以通过HTTP请求发送的标头告诉Web服务器仅向您发送响应中的标头而没有正文内容?
我正在使用cURL来发出这样的请求,但从技术上讲,我认为应该可以将简单的头部作为请求的一部分发送.
例如,存在304 Not Modified HTTP Response Code.当您使用缓存标记或日期时间信息向服务器发出请求时,服务器可以检测到该请求,并仅返回标头作为响应,告知用户代理将其缓存用作响应.这意味着在带宽方面,服务器的响应非常非常小.
但是,是否有可以发送到服务器的标头,使服务器只返回标题而没有正文内容?
这里的想法是制作HTTP请求,否则可能返回大量数据,非常小.例如,可以返回JSON数据或日志的API调用,实际上用户代理唯一感兴趣的是确保请求通过而没有其他任何内容.这是为了在主体可能存在的情况下最小化进出服务器的带宽,但是在用户代理正在做什么的上下文中是不必要的.
虽然可以设计一个监听特定自定义标题或其他东西的API,但除非必须,否则我宁愿不这样做.但我一直无法找到是否有一种标准化的方式来发出HTTP请求,告诉服务器不发送任何正文内容?
我是一家大型金融公司的架构师,我们正在开始在不同国家实施一个新的面向业务的信息系统.
从很早开始,核心思想就是尽可能遵循面向微服务的原则(并确保工程师阅读Sam Newman撰写的"构建微服务"一书).
到现在为止,我已经到了十字路口.我们的服务主要是使用Swagger进行自动化文档的JSON REST服务,但是为了在我们的业务流程中使用这些服务并确保不将业务逻辑写入这些服务域之外的服务,我们一直使用Camunda作为编排工具.而且Camunda很好(虽然有些人认为Corezoid是另一种选择),但在一套优雅的服务中却有些笨拙.
现在,服务编排是大多数工程师都非常熟悉的概念.但由于仍然拥有驱动一切的中央引擎,因此我并不完全满意.在以后的路上更换是非常昂贵的(虽然替换比单块更便宜).即使这个中央引擎被分成多个引擎(实际上就是今天的情况),它也不一定能让它变得更好.
近年来,有一种微服务向精心设计(接近事件驱动)架构的运动.正是在这一点上,我正在寻找那些面临类似十字路口决策点的工程师和建筑师的建议.
我非常喜欢分离式架构的想法,尽管在杀死巨型组件和拥有优雅的独立服务方面感觉良好,但我仍然在当前的协调解决方案中检测到业务流程中的许多依赖关系,而这些解决方案实际上并不存在.
这并不像我们正在避免事件.我们实际上已经在我们的体系结构上实现了事件,以便将许多进程与核心原则分离,如果您不需要同步响应并且只需要通知发生的事情以启动另一个进程,则可能会发生一个事件.被另一个开始执行的进程捕获.并且编排更容易解释和可视化,更容易被更具技术头脑的业务用户调整和修改.我认为从业务角度来测试和验证更容易.像这样的协调体系结构(通常)也期望良好的服务发现和高质量的自动化文档和非功能性需求,这些都是我非常重视的.
所有这些对我来说都是编排问题的问题,因为我没有大规模运行这个问题的第一手经验 - 只是一些本地测试原型.
但我想你知道我来自哪里.我试图考虑替代方案,而不必后悔以其他方式驾驶公司.
也许你可以分享自己与类似情况的经历或分享一两个有趣的链接?或者我在寻找一个尚不存在的银弹?
我已经编码多年了,发现自己处于挫折之中.我正在开发一个新的基于Web的服务,它也有一个用户界面,它将从头开始开发.它将使用一些开源组件,但主要是一个新的东西.
但这是我的问题.构建这样的系统意味着构建所有这些组件:
我希望他们所有人都遵循相同的"模式",系统中的模块由一个文件夹或一组文件组成,这些文件包含该模块中的所有这些组件.
但是我很难获得这个架构以便我喜欢它.这是我到目前为止:
但我确实感到非常愚蠢 - 因为以程序的方式构建了主系统.我最初开始在OOP中开始编写它,但由于必须使所有内容都适合同一系统,因此很快发现自己处于头痛状态.它是OOP,但它是紧密耦合的,我不喜欢它,虽然它是以OOP方式编写的,组件实际上不是那么独立或者只是管理的麻烦.
我可以遵循任何模式或指南来获得更好的结果吗?我喜欢当前的系统是我可以调用任何东西,预览呈现PHP,或HTML视图,CSS样式,额外的Javascript函数和每个需求的AJAX通信,保持脚步非常小,但它感觉很脏.我甚至使用全局主数据库连接(尽管它是一个全局对象).
有任何想法吗?如果它只是一种语言就不会成为一个问题,但试图让一切工作在一起是一件令人头痛的问题.
谢谢!
我在实现与Java一起使用的API时遇到问题,但无法使用cURL.到目前为止,我们已经完成了所有事情,并且必须在Java生成的请求和我们制作的内容之间有所不同.
在PHP中,我们可以通过查看$_SERVER['HTTP_*']变量获取头数据,我们可以从请求体获取file_get_contents('php://input');但是我们无法获得从用户代理发送到客户端的确切数据.
是否可以通过PHP获取用户代理发送的完整请求?包括标题和身体?如果是这样,那怎么样?
我找到的唯一例子就是这里,但是这个以我提到的方式得到了身体,而它通过解析得到了标题$_SERVER,这似乎是一个黑客,因为它从来不是实际发送的100%.
所有帮助和提示表示赞赏!
这就是事情.我的一位同事试图覆盖我们使用的框架的会话处理.默认情况下,此框架使用PHP自己的本机会话处理,但他现在正尝试在请求之间实现数据库层.
问题是数据库对象在编写会话时不可用,但它可用于其他功能,例如从会话中读取数据时.这是一种疯狂的行为.这是我们做的:
register_shutdown_function('exithandler');
session_set_save_handler(
'sess_open',
'sess_close',
'sess_read',
'sess_write',
'sess_destroy',
'sess_gc'
);
Run Code Online (Sandbox Code Playgroud)
这些函数中的每一个也会在我们的日志文件中写入一行,我们可以使用该函数的名称进行跟踪.无论何时调用该函数,都会执行此操作.现在这里有两个请求的URL,第一个是实际写入会话的地方(会话的新数据),第二个是刚刚检查会话数据的(并且没有写入).这是谜题:
/login/
sess_open
sess_read
exithandler
sess_write
sess_close
/account/
sess_open
sess_read
sess_write
sess_close
exithandler
Run Code Online (Sandbox Code Playgroud)
为什么这种行为有所不同?为什么在将数据存储在会话中之前调用退出处理程序,为什么对于常规页面而言同样如此,即使确实调用了相同的方法?
问题是在调用exithandler之后我们的类都不再可用了,我假设PHP垃圾收集器在我们所有的类上都调用了__destruct()方法,它们就不见了.这很糟糕.
任何人都知道为什么PHP会这样做?
好吧,这是我的情况.我有一个JavaScript类,处理AJAX表单提交和其他相关的同步和异步请求.它收集数据,然后将此数据设置为请求的临时存储,然后使用临时存储数据发出请求.
例如:
这意味着如果两个请求同时通过同一个对象进行,那么我仍然可以访问用于发出这些请求的数据.
一切都按预期工作,直到我想使用HTML5 FileList和FormData.虽然我可以相对轻松地在JavaScript中克隆对象,但我无法克隆FileList.这是一个例子:
<html>
<head>
<script type="text/javascript">
// This method is used to clone data objects
function clone(object){
if(object==null || typeof(object)!=='object'){
return object;
}
// This line throws the error when FileList data is attempted to be cloned
var tmp=object.constructor();
for(var key in object){
tmp[key]=clone(object[key]);
}
return tmp;
}
// This is an example data storage
var submitData=new Object();
submitData['some-data']='abc';
function uploader(files){
submitData['my-files']=files;
// This clones the object and leads to the error …Run Code Online (Sandbox Code Playgroud) 在去年的大部分时间里,我的公司一直在根据(微)服务架构的原则切割整体并构建新产品.这一切都很好,并为我们提供了很大的灵活性,可以保持UI和后端逻辑的分离,并降低依赖性.
但!
由于这一点,我们的业务中有一个重要的部分,即报告.
由于我们确保服务之间没有数据复制(和业务逻辑共享),因此每个服务都知道自己的数据,如果另一个服务确实需要保留对该数据的引用,那么它们通过ID来实现(实体链接,基本上).虽然它很棒,但报道并不好.
我们的业务通常需要创建关于客户发生的特定实例的临时报告.在"过去的日子"中,您创建了一个简单的SQL查询,它连接了几个数据库表并查询了您需要的任何内容,但是对于解耦服务是不可能的.这是业务所看到的问题.
我个人并不是后端报告用途的数据复制的粉丝,因为这可能有另一种趋势,即成长为一场噩梦(它甚至已经存在于我们的传统巨石中).所以这个问题实际上不是关于传统的单块与现代微服务,而是关于数据依赖性.
您是否遇到过这样的问题,如果是,那么您是如何解决的?
编辑:
我们一直在内部讨论如何解决这个问题的几个潜在解决方案,但它们都没有实际上是好的,我没有得到我正在寻找的答案,但它解决了大规模的问题.
很好的旧复制 - 一切 - 让我们 - 人们 - 想出它是今天仍然习惯的东西.从旧的整体时代开始,BI /数据仓库团队制作了所有数据库的副本,但是同样的做法更加不方便,但到目前为止仍然使用数据库的所有微服务都做了.由于各种原因,这并不好,并伴随着你可以期待的共享沙盒癌症.
构建一个单独的微服务或一组用于获取特定报告的微服务.它们中的每一个都连接到设置微服务,其中包含相关数据并按预期构建报告.然而,这会引入更紧密的耦合,并且对于大型数据集而言可能非常复杂且速度慢.
构建一个单独的微服务或一组微服务,每个服务都有从后台其他数据库复制的数据库.这是有问题的,因为团队数据库正在耦合,数据被直接复制,并且强烈依赖于正在使用的数据库技术.
让每个服务向RabbitMQ发送BI服务可以接收的事件,然后根据需要获取其他数据.这听起来对我来说是最好的,但到目前为止最复杂的实现,因为所有服务都需要开始发布相关数据.这是我个人现在所选择的,从一个非常抽象的层面,就是这样.
我在我的 WWW 框架中使用了大量 API 调用的缓存和缓冲,我最终使用的其中一件事是“指纹”数据以匹配缓存文件名以及检测已经进行的 API 调用.
许多数据在数组中移动,例如 GET、POST 等。因此,API 调用的唯一性取决于数据。
因此,我需要对这些信息进行指纹识别。要做到这一点,还需要从数据数组中生成一个“指纹”,并将其散列成一个我可以存储和比较的字符串。
对于数组序列化,PHP 中有 serialize() 和 json_encode()。经过各种基准测试后,我认为 json_encode() 是序列化数组的更快方法,并且对它非常满意。
对于散列,有 md5() 和 sha1() 函数,根据我的基准测试,其中 md5() 更快。
所以我目前的指纹算法是:
$fingerprint=md5(json_encode($array));
Run Code Online (Sandbox Code Playgroud)
但我怀疑这是否是在 PHP 中对数组进行指纹识别的“最快”方法。我尝试过 Google 和 StackOverflow,但还没有找到好的替代品。我是在正确的轨道上还是需要做一些不同的事情?
我在这里有一个小问题,如何告诉cURL专门将文件附加到请求?
如果我使用cURL上传文件,那么通常的方法是将其作为POST数据数组的一部分附加,其前面的值为@,例如:
CURLOPT_POSTFIELDS=>array('my-file'=>'@my-file.txt')
Run Code Online (Sandbox Code Playgroud)
这显然有效,但我有两个问题:
cURL CURLOPT_INFILE不是一个选项,因为它不会显示为$ _FILES数组的一部分.
在cURL中似乎有一个漏洞依赖于POST字段值中的@符号.有办法解决吗?为什么没有CURLOPT_FILEFIELDS数组?命令行cURL有一个单独的标志(-F),但由于某些原因我不认为它是PHP中的一个选项.
任何帮助将不胜感激,谢谢!
我正在努力帮助一位出色的设计师,她的Dropbox上的空间已经空白,但已经支付了100GB的托管服务费用.是否有一个可以工作的软件,它可以无缝地集成到资源管理器中,并在FTP上更新您自己可以分配的文件?
谢谢!
php ×7
curl ×2
debugging ×2
javascript ×2
request ×2
soa ×2
api ×1
architecture ×1
arrays ×1
audit ×1
browser ×1
capture ×1
cloning ×1
cookies ×1
database ×1
dropbox ×1
file ×1
file-sharing ×1
file-upload ×1
fingerprint ×1
forwarding ×1
frameworks ×1
ftp ×1
hash ×1
header ×1
html ×1
html5 ×1
http ×1
ini ×1
ip ×1
object ×1
oop ×1
parsing ×1
performance ×1
proxy ×1
reporting ×1
response ×1
service ×1
session ×1
shutdown ×1
sync ×1
upload ×1
web-services ×1
webserver ×1