HttpFoundation组件< /h1>
编辑该页面< /a>
警告< /b>:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2< /a>,不再维护。< /p>
HttpFoundation组件< /a>
深入框架创建过程之前,让我们先退一步,让我们看一看为什么你想使用一个框架,而不是让你知道老式的PHP应用程序。为什么使用一个框架实际上是一个好主意,即使是最简单的代码片段,为什么创建您在Symfony框架组件比从头创建一个框架。ob娱乐下载< /p>
请注意< /span>
我们不会谈论传统工作时使用一个框架的好处与几大应用程序开发人员;互联网已经很多话题的好资源。< /p>
即使我们在前一章中写道“应用程序”是很简单,它也存在一些问题:< /p>
1 2 3 4< /pre>
/ /框架/ index . php< /span>美元< /span>的名字< /span>=美元< /span>_GET< /span>(“名字”< /span>];printf (“你好% s”< /span>,美元< /span>的名字< /span>);< /code>
首先,如果的名字< /code>查询参数的URL查询字符串中没有定义,你会得到一个PHP警告;让我们改正:< /p>
1 2 3 4< /pre>
/ /框架/ index . php< /span>美元< /span>的名字< /span>=美元< /span>_GET< /span>(“名字”< /span>)? ?“世界”< /span>;printf (“你好% s”< /span>,美元< /span>的名字< /span>);< /code>
然后,这应用程序是不安全的< /em>。你能相信吗?甚至这个简单的PHP代码片段很容易受到最广泛的网络安全问题,XSS(跨站点脚本)。这是一个更安全的版本:< /p>
1 2 3 4 5< /pre>
美元< /span>的名字< /span>=美元< /span>_GET< /span>(“名字”< /span>)? ?“世界”< /span>;头(内容类型:text / html;charset = utf - 8 '< /span>);printf (“你好% s”< /span>,:美元< /span>的名字< /span>ENT_QUOTES,“utf - 8”< /span>));< /code>
请注意< /span>
正如您可能已经注意到,确保您的代码htmlspecialchars函数< /code>是单调乏味,而且容易出错。这是使用模板引擎的原因之一嫩枝< /a>,auto-escaping在缺省情况下是启用的,可能是一个好主意(显式的逃避也不那么痛苦与一个简单的使用e< /code>过滤器)。< /p>
正如你所看到的,我们写了简单的代码首先是不再那么简单了,如果我们想避免PHP警告/注意到和使代码更安全。< /p>
除了安全之外,这段代码可以复杂的测试。即使没有多少测试,它震撼了我,编写单元测试最简单的PHP代码片段不自然,觉得丑。这是一个初步PHPUnit)上面的代码单元测试:< /p>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16< /pre>
/ /框架/ test.php< /span>使用< /span>PHPUnit)< /span>\框架< /span>\TestCase< /span>;类< /span>IndexTest< /span>扩展< /span>TestCase< /span>{公共< /span>函数< /span>testHello< /span>()< /span>{美元< /span>_GET< /span>(“名字”< /span>]=“法”< /span>;ob_start ();包括< /span>“index . php”< /span>;美元< /span>内容< /span>= ob_get_clean ();美元< /span>这< /span>- >< /span>assertequal (“你好法”< /span>,美元< /span>内容< /span>);}}< /code>
请注意< /span>
如果我们的应用程序只是略大,我们将能够找到更多的问题。如果你是好奇,阅读ob娱乐下载Symfony PHP与平< /a>这本书的一章。< /p>
在这一点上,如果你不相信,安全性和测试确实是两个很好的理由不写代码旧方式,转而采用框架(无论采用框架意味着在这种情况下),你现在可以停止阅读这本书,回到任何代码之前正在。< /p>
请注意< /span>
使用一个框架应该给你的不仅仅是安全性和可测试性,但更重要的是要记住,你选择的框架必须允许您编写更好的代码更快。< /p>
OOP HttpFoundation组件< /a>
编写网页代码与HTTP交互。所以,我们的框架的基本原则应该在HTTP规范< /a>。< /p>
HTTP规范描述了一个客户端(例如浏览器)与服务器进行交互(通过web服务器应用程序)。客户端和服务器之间的对话框是由明确的规定消息< /em>请求和响应:客户端发送一个请求到服务器,并基于此请求,服务器返回一个响应< /em>。< /p>
在PHP中,请求用全局变量($ _GET< /code>,$ _POST< /code>,带有_FILE美元< /code>,_COOKIE美元< /code>,_SESSION美元< /code>…)和生成的响应函数(回声< /code>,头< /code>,setcookie< /code>,……)。< /p>
第一步可能是更好的代码使用面向对象的方法;的主要目标的Symfony HttpFoundationob娱乐下载组件:替换默认的PHP全局变量和函数通过面向对象层。< /p>
使用这个组件,添加它的依赖项目:< /p>
1< /pre>
美元< /span>作曲家需要symfony / htob娱乐下载tp-foundation< /code>
运行这个命令也会自动下载Symfony HttpFoundation组件和安装它ob娱乐下载供应商/< /code>目录中。一个composer.json< /code>和一个composer.lock< /code>将生成的文件,包含了新的需求。< /p>
类半自动的< /span>
在安装一个新的依赖,作曲家也会生成一个供应商/ autoload.php< /code>文件,允许将任何类自动装载< /a>。没有半自动的,你需要之前,需要定义一个类文件能够使用它。但由于PSR-4< /a>,我们可以让作曲家和PHP为我们做艰苦的工作。< /p>
现在,让我们重写应用程序使用请求< /code>和响应< /code>类:< /p>
1 2 3 4 5 6 7 8 9 10 11 12 13< /pre>
/ /框架/ index . php< /span>require_once< /span>__DIR__< /span>。“/供应商/ autoload.php”< /span>;使用< /span>ob娱乐下载\组件< /span>\HttpFoundation< /span>\请求< /span>;使用< /span>ob娱乐下载\组件< /span>\HttpFoundation< /span>\响应< /span>;美元< /span>请求< /span>=请求::< /span>createFromGlobals ();美元< /span>的名字< /span>=美元< /span>请求< /span>- >< /span>get (“名字”< /span>,“世界”< /span>);美元< /span>响应< /span>=新< /span>响应(sprintf (“你好% s”< /span>,:美元< /span>的名字< /span>ENT_QUOTES,“utf - 8”< /span>)));美元< /span>响应< /span>- >< /span>send ();< /code>
的createFromGlobals ()< /code>方法创建一个请求< /code>基于当前的PHP对象全局变量。< /p>
的send ()< /code>方法发送响应< /code>对象返回到客户机(HTTP头后面跟着它首先输出内容)。< /p>
提示< /span>
之前send ()< /code>电话,我们应该添加一个调用准备()< /code>方法((响应- >准备美元请求);< /code>),以确保我们的反应是符合HTTP规范。例如,如果我们要调用的页面头< /code>方法,它将消除响应的内容。< /p>
前面的代码的主要区别在于,你有完全控制的HTTP消息。你可以创造任何你想要的要求,负责发送响应每当你认为合适的。< /p>
请注意< /span>
我们还没有显式地设置内容类型< /code>头在重写代码响应对象默认的字符集utf - 8< /code>。< /p>
与请求< /code>类,你有所有请求的信息在你的指尖由于一个不错的和简单的API:< /p>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22< /pre>
/ /被请求的URI(例如/关于)-任何查询参数< /span>美元< /span>请求< /span>- >< /span>getPathInfo ();/ /检索GET和POST变量分别< /span>美元< /span>请求< /span>- >< /span>查询- >< /span>get (“foo”< /span>);美元< /span>请求< /span>- >< /span>请求- >< /span>get (“酒吧”< /span>,“如果酒吧不存在默认值”< /span>);/ /获取服务器变量< /span>美元< /span>请求< /span>- >< /span>服务器- >< /span>get (“HTTP_HOST”< /span>);/ /检索UploadedFile被foo的实例< /span>美元< /span>请求< /span>- >< /span>文件- >< /span>get (“foo”< /span>);/ /检索COOKIE的值< /span>美元< /span>请求< /span>- >< /span>饼干- >< /span>get (“PHPSESSID”< /span>);/ /检索HTTP请求头,规范化,小写字母键< /span>美元< /span>请求< /span>- >< /span>头- >< /span>get (“主机”< /span>);美元< /span>请求< /span>- >< /span>头- >< /span>get (“内容类型”< /span>);美元< /span>请求< /span>- >< /span>getMethod ();/ / GET、POST、PUT、DELETE,头< /span>美元< /span>请求< /span>- >< /span>getLanguages ();/ /客户端接受语言的数组< /span>
你也可以模拟一个请求:< /p>
1< /pre>
美元< /span>请求< /span>=请求::< /span>创建(“/ index . php ? name =法”< /span>);< /code>
与响应< /code>类,你可以调整反应:< /p>
1 2 3 4 5 6 7 8< /pre>
美元< /span>响应< /span>=新< /span>反应();美元< /span>响应< /span>- >< /span>setContent (“Hello world !”< /span>);美元< /span>响应< /span>- >< /span>setStatusCode (200年< /span>);美元< /span>响应< /span>- >< /span>头- >< /span>集(“内容类型”< /span>,“text / html”< /span>);/ /配置HTTP缓存头< /span>美元< /span>响应< /span>- >< /span>setMaxAge (10< /span>);< /code>
提示< /span>
调试一个响应,丢给一个字符串;它将返回HTTP响应(标题和内容)的代表。< /p>
最后但并非最不重要的是,这些类,像所有其他类在Symfony代码,ob娱乐下载经审计的< /a>安全问题由一个独立的公司。作为一个开源项目也意味着许多世界各地的其他开发人员阅读代码和已经固定的潜在的安全问题。你上次是什么时候要求自制的专业安全审计框架?< /p>
甚至一些简单客户端IP地址可以不安全:< /p>
1 2 3< /pre>
如果< /span>(美元< /span>myIp< /span>= = =美元< /span>_SERVER< /span>(“REMOTE_ADDR”< /span>){/ /客户端是一个已知的一个,所以给它更多的特权< /span>}< /code>
效果非常好,直到你添加一个反向代理的生产服务器;在这一点上,你将不得不改变你的代码让它工作在您的开发机(你没有代理)和您的服务器:< /p>
1 2 3< /pre>
如果< /span>(美元< /span>myIp< /span>= = =美元< /span>_SERVER< /span>(“HTTP_X_FORWARDED_FOR”< /span>)| |美元< /span>myIp< /span>= = =美元< /span>_SERVER< /span>(“REMOTE_ADDR”< /span>){/ /客户端是一个已知的一个,所以给它更多的特权< /span>}< /code>
使用要求::getClientIp ()< /code>方法从一开始就会给你正确的行为(它会覆盖的情况你有链接代理):< /p>
1 2 3 4 5< /pre>
美元< /span>请求< /span>=请求::< /span>createFromGlobals ();如果< /span>(美元< /span>myIp< /span>= = =美元< /span>请求< /span>- >< /span>getClientIp ()) {/ /客户端是一个已知的一个,所以给它更多的特权< /span>}< /code>
还有一个额外的好处:它是安全< /em>默认情况下。这是什么意思?的$ _SERVER (“HTTP_X_FORWARDED_FOR”)< /code>价值不能信任,因为它可以被最终用户在没有代理。因此,如果您正在使用这段代码在生产中没有一个代理,它变得非常容易滥用您的系统。那不是的getClientIp ()< /code>方法,您必须显式地相信你的反向代理通过调用setTrustedProxies ()< /code>:< /p>
1 2 3 4 5< /pre>
请求::< /span>setTrustedProxies ([“10.0.0.1”表示< /span>]);如果< /span>(美元< /span>myIp< /span>= = =美元< /span>请求< /span>- >< /span>getClientIp ()) {/ /客户端是一个已知的一个,所以给它更多的特权< /span>}< /code>
所以,getClientIp ()< /code>在所有情况下安全地方法。你可以用它在你所有的项目,无论配置,它将正确安全的行为。这是使用一个框架的目标之一。如果你是从头开始编写一个框架,你必须考虑所有这些情况下自己。为什么不使用技术,已经工作了吗?< /p>
请注意< /span>
如果你想了解更多关于HttpFoundation组件,你可以看一下ob娱乐下载Symfony \ \ HttpFoundation组件< /code>其专用API或阅读欧宝官网下载app。< /p>
信不信由你,但我们有我们的第一个框架。你可以停止现在,如果你想要的。仅使用Symfony Httpob娱乐下载Foundation组件已经允许您编写更好、更可测试的代码。它还允许您编写代码更快的尽可能多的日常问题已经解决。< /p>
事实上,Drupal项目采用HttpFoundation组件;如果成功的话,它可能会为你工作。不要重新发明轮子。< /p>
我几乎忘记了谈论一个额外的好处:使用HttpFoundation组件是更好的开始之间的互操作性框架和使用它的应用程序< /a>(如ob娱乐下载,Drupal 8< /a>,phpBB 3< /a>,Laravel< /a>和ezPublish 5< /a>,更多的< /a>)。< /p>
警告< /b>:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2< /a>,不再维护。< /p>
HttpFoundation组件< /a>
深入框架创建过程之前,让我们先退一步,让我们看一看为什么你想使用一个框架,而不是让你知道老式的PHP应用程序。为什么使用一个框架实际上是一个好主意,即使是最简单的代码片段,为什么创建您在Symfony框架组件比从头创建一个框架。ob娱乐下载< /p>
请注意< /span>
我们不会谈论传统工作时使用一个框架的好处与几大应用程序开发人员;互联网已经很多话题的好资源。< /p>
即使我们在前一章中写道“应用程序”是很简单,它也存在一些问题:< /p>
1 2 3 4< /pre>
/ /框架/ index . php< /span>美元< /span>的名字< /span>=美元< /span>_GET< /span>(“名字”< /span>];printf (“你好% s”< /span>,美元< /span>的名字< /span>);< /code>
首先,如果 然后,这应用程序是不安全的< /em>。你能相信吗?甚至这个简单的PHP代码片段很容易受到最广泛的网络安全问题,XSS(跨站点脚本)。这是一个更安全的版本:< /p>
请注意< /span> 正如您可能已经注意到,确保您的代码 正如你所看到的,我们写了简单的代码首先是不再那么简单了,如果我们想避免PHP警告/注意到和使代码更安全。< /p>
除了安全之外,这段代码可以复杂的测试。即使没有多少测试,它震撼了我,编写单元测试最简单的PHP代码片段不自然,觉得丑。这是一个初步PHPUnit)上面的代码单元测试:< /p>
请注意< /span> 如果我们的应用程序只是略大,我们将能够找到更多的问题。如果你是好奇,阅读ob娱乐下载Symfony PHP与平< /a>这本书的一章。< /p>
在这一点上,如果你不相信,安全性和测试确实是两个很好的理由不写代码旧方式,转而采用框架(无论采用框架意味着在这种情况下),你现在可以停止阅读这本书,回到任何代码之前正在。< /p>
请注意< /span> 使用一个框架应该给你的不仅仅是安全性和可测试性,但更重要的是要记住,你选择的框架必须允许您编写更好的代码更快。< /p>
编写网页代码与HTTP交互。所以,我们的框架的基本原则应该在HTTP规范< /a>。< /p>
HTTP规范描述了一个客户端(例如浏览器)与服务器进行交互(通过web服务器应用程序)。客户端和服务器之间的对话框是由明确的规定消息< /em>请求和响应:客户端发送一个请求到服务器,并基于此请求,服务器返回一个响应< /em>。< /p>
在PHP中,请求用全局变量( 第一步可能是更好的代码使用面向对象的方法;的主要目标的Symfony HttpFoundationob娱乐下载组件:替换默认的PHP全局变量和函数通过面向对象层。< /p>
使用这个组件,添加它的依赖项目:< /p>
运行这个命令也会自动下载Symfony HttpFoundation组件和安装它ob娱乐下载 类半自动的< /span> 在安装一个新的依赖,作曲家也会生成一个 现在,让我们重写应用程序使用 的 的
提示< /span> 之前 前面的代码的主要区别在于,你有完全控制的HTTP消息。你可以创造任何你想要的要求,负责发送响应每当你认为合适的。< /p>
请注意< /span> 我们还没有显式地设置 与 你也可以模拟一个请求:< /p>
与
提示< /span> 调试一个响应,丢给一个字符串;它将返回HTTP响应(标题和内容)的代表。< /p>
最后但并非最不重要的是,这些类,像所有其他类在Symfony代码,ob娱乐下载经审计的< /a>安全问题由一个独立的公司。作为一个开源项目也意味着许多世界各地的其他开发人员阅读代码和已经固定的潜在的安全问题。你上次是什么时候要求自制的专业安全审计框架?< /p>
甚至一些简单客户端IP地址可以不安全:< /p>
效果非常好,直到你添加一个反向代理的生产服务器;在这一点上,你将不得不改变你的代码让它工作在您的开发机(你没有代理)和您的服务器:< /p>
使用 还有一个额外的好处:它是安全< /em>默认情况下。这是什么意思?的 所以,
请注意< /span> 如果你想了解更多关于HttpFoundation组件,你可以看一下 信不信由你,但我们有我们的第一个框架。你可以停止现在,如果你想要的。仅使用Symfony Httpob娱乐下载Foundation组件已经允许您编写更好、更可测试的代码。它还允许您编写代码更快的尽可能多的日常问题已经解决。< /p>
事实上,Drupal项目采用HttpFoundation组件;如果成功的话,它可能会为你工作。不要重新发明轮子。< /p>
我几乎忘记了谈论一个额外的好处:使用HttpFoundation组件是更好的开始之间的互操作性框架和使用它的应用程序< /a>(如ob娱乐下载,Drupal 8< /a>,phpBB 3< /a>,Laravel< /a>和ezPublish 5< /a>,更多的< /a>)。< /p>
的名字< /code>查询参数的URL查询字符串中没有定义,你会得到一个PHP警告;让我们改正:< /p>
1 2 3 4< /pre>
/ /框架/ index . php< /span>美元< /span>的名字< /span>=美元< /span>_GET< /span>(“名字”< /span>)? ?“世界”< /span>;printf (“你好% s”< /span>,美元< /span>的名字< /span>);< /code>
1 2 3 4 5< /pre>
美元< /span>的名字< /span>=美元< /span>_GET< /span>(“名字”< /span>)? ?“世界”< /span>;头(内容类型:text / html;charset = utf - 8 '< /span>);printf (“你好% s”< /span>,:美元< /span>的名字< /span>ENT_QUOTES,“utf - 8”< /span>));< /code>
htmlspecialchars函数< /code>是单调乏味,而且容易出错。这是使用模板引擎的原因之一嫩枝< /a>,auto-escaping在缺省情况下是启用的,可能是一个好主意(显式的逃避也不那么痛苦与一个简单的使用
e< /code>过滤器)。< /p>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16< /pre>
/ /框架/ test.php< /span>使用< /span>PHPUnit)< /span>\框架< /span>\TestCase< /span>;类< /span>IndexTest< /span>扩展< /span>TestCase< /span>{公共< /span>函数< /span>testHello< /span>()< /span>{美元< /span>_GET< /span>(“名字”< /span>]=“法”< /span>;ob_start ();包括< /span>“index . php”< /span>;美元< /span>内容< /span>= ob_get_clean ();美元< /span>这< /span>- >< /span>assertequal (“你好法”< /span>,美元< /span>内容< /span>);}}< /code>
OOP HttpFoundation组件< /a>
$ _GET< /code>,
$ _POST< /code>,
带有_FILE美元< /code>,
_COOKIE美元< /code>,
_SESSION美元< /code>…)和生成的响应函数(
回声< /code>,
头< /code>,
setcookie< /code>,……)。< /p>
1< /pre>
美元< /span>作曲家需要symfony / htob娱乐下载tp-foundation< /code>
供应商/< /code>目录中。一个
composer.json< /code>和一个
composer.lock< /code>将生成的文件,包含了新的需求。< /p>
供应商/ autoload.php< /code>文件,允许将任何类自动装载< /a>。没有半自动的,你需要之前,需要定义一个类文件能够使用它。但由于PSR-4< /a>,我们可以让作曲家和PHP为我们做艰苦的工作。< /p>
请求< /code>和
响应< /code>类:< /p>
1 2 3 4 5 6 7 8 9 10 11 12 13< /pre>
/ /框架/ index . php< /span>require_once< /span>__DIR__< /span>。“/供应商/ autoload.php”< /span>;使用< /span>ob娱乐下载\组件< /span>\HttpFoundation< /span>\请求< /span>;使用< /span>ob娱乐下载\组件< /span>\HttpFoundation< /span>\响应< /span>;美元< /span>请求< /span>=请求::< /span>createFromGlobals ();美元< /span>的名字< /span>=美元< /span>请求< /span>- >< /span>get (“名字”< /span>,“世界”< /span>);美元< /span>响应< /span>=新< /span>响应(sprintf (“你好% s”< /span>,:美元< /span>的名字< /span>ENT_QUOTES,“utf - 8”< /span>)));美元< /span>响应< /span>- >< /span>send ();< /code>
createFromGlobals ()< /code>方法创建一个
请求< /code>基于当前的PHP对象全局变量。< /p>
send ()< /code>方法发送
响应< /code>对象返回到客户机(HTTP头后面跟着它首先输出内容)。< /p>
send ()< /code>电话,我们应该添加一个调用
准备()< /code>方法(
(响应- >准备美元请求);< /code>),以确保我们的反应是符合HTTP规范。例如,如果我们要调用的页面
头< /code>方法,它将消除响应的内容。< /p>
内容类型< /code>头在重写代码响应对象默认的字符集
utf - 8< /code>。< /p>
请求< /code>类,你有所有请求的信息在你的指尖由于一个不错的和简单的API:< /p>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22< /pre>
/ /被请求的URI(例如/关于)-任何查询参数< /span>美元< /span>请求< /span>- >< /span>getPathInfo ();/ /检索GET和POST变量分别< /span>美元< /span>请求< /span>- >< /span>查询- >< /span>get (“foo”< /span>);美元< /span>请求< /span>- >< /span>请求- >< /span>get (“酒吧”< /span>,“如果酒吧不存在默认值”< /span>);/ /获取服务器变量< /span>美元< /span>请求< /span>- >< /span>服务器- >< /span>get (“HTTP_HOST”< /span>);/ /检索UploadedFile被foo的实例< /span>美元< /span>请求< /span>- >< /span>文件- >< /span>get (“foo”< /span>);/ /检索COOKIE的值< /span>美元< /span>请求< /span>- >< /span>饼干- >< /span>get (“PHPSESSID”< /span>);/ /检索HTTP请求头,规范化,小写字母键< /span>美元< /span>请求< /span>- >< /span>头- >< /span>get (“主机”< /span>);美元< /span>请求< /span>- >< /span>头- >< /span>get (“内容类型”< /span>);美元< /span>请求< /span>- >< /span>getMethod ();/ / GET、POST、PUT、DELETE,头< /span>美元< /span>请求< /span>- >< /span>getLanguages ();/ /客户端接受语言的数组< /span>
1< /pre>
美元< /span>请求< /span>=请求::< /span>创建(“/ index . php ? name =法”< /span>);< /code>
响应< /code>类,你可以调整反应:< /p>
1 2 3 4 5 6 7 8< /pre>
美元< /span>响应< /span>=新< /span>反应();美元< /span>响应< /span>- >< /span>setContent (“Hello world !”< /span>);美元< /span>响应< /span>- >< /span>setStatusCode (200年< /span>);美元< /span>响应< /span>- >< /span>头- >< /span>集(“内容类型”< /span>,“text / html”< /span>);/ /配置HTTP缓存头< /span>美元< /span>响应< /span>- >< /span>setMaxAge (10< /span>);< /code>
1 2 3< /pre>
如果< /span>(美元< /span>myIp< /span>= = =美元< /span>_SERVER< /span>(“REMOTE_ADDR”< /span>){/ /客户端是一个已知的一个,所以给它更多的特权< /span>}< /code>
1 2 3< /pre>
如果< /span>(美元< /span>myIp< /span>= = =美元< /span>_SERVER< /span>(“HTTP_X_FORWARDED_FOR”< /span>)| |美元< /span>myIp< /span>= = =美元< /span>_SERVER< /span>(“REMOTE_ADDR”< /span>){/ /客户端是一个已知的一个,所以给它更多的特权< /span>}< /code>
要求::getClientIp ()< /code>方法从一开始就会给你正确的行为(它会覆盖的情况你有链接代理):< /p>
1 2 3 4 5< /pre>
美元< /span>请求< /span>=请求::< /span>createFromGlobals ();如果< /span>(美元< /span>myIp< /span>= = =美元< /span>请求< /span>- >< /span>getClientIp ()) {/ /客户端是一个已知的一个,所以给它更多的特权< /span>}< /code>
$ _SERVER (“HTTP_X_FORWARDED_FOR”)< /code>价值不能信任,因为它可以被最终用户在没有代理。因此,如果您正在使用这段代码在生产中没有一个代理,它变得非常容易滥用您的系统。那不是的
getClientIp ()< /code>方法,您必须显式地相信你的反向代理通过调用
setTrustedProxies ()< /code>:< /p>
1 2 3 4 5< /pre>
请求::< /span>setTrustedProxies ([“10.0.0.1”表示< /span>]);如果< /span>(美元< /span>myIp< /span>= = =美元< /span>请求< /span>- >< /span>getClientIp ()) {/ /客户端是一个已知的一个,所以给它更多的特权< /span>}< /code>
getClientIp ()< /code>在所有情况下安全地方法。你可以用它在你所有的项目,无论配置,它将正确安全的行为。这是使用一个框架的目标之一。如果你是从头开始编写一个框架,你必须考虑所有这些情况下自己。为什么不使用技术,已经工作了吗?< /p>
ob娱乐下载Symfony \ \ HttpFoundation组件< /code>其专用API或阅读欧宝官网下载app。< /p>