数码资讯
用PHP编写安全脚本代码
在PHP 4中,他们取消了旧的练习!正如我将在本文中解释的那样,进行这种更改的目的是为了考虑安全性。我们将研究PHP处理表单提交和其他数据的新做法,并解释为什么这将提高代码的安全性。 这里怎么了 请看下面的PHP脚本,它用于在输入用户名和密码正确时授权访问Web页面: 复制代码代码如下所示: < P
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
在PHP 4中,他们取消了旧的练习!正如我将在本文中解释的那样,进行这种更改的目的是为了考虑安全性。我们将研究PHP处理表单提交和其他数据的新做法,并解释为什么这将提高代码的安全性。
这里怎么了
请看下面的PHP脚本,它用于在输入用户名和密码正确时授权访问Web页面:
复制代码代码如下所示:
< PHP
检查用户名和密码。
如果($用户名= = 'kevin'and密码= =美元的秘密)
授权=真;
>
请输入您的用户名和密码:
方法
用户名:
密码:
好吧,我相信大约一半的读者会说得太愚蠢,我不会犯这样的错误!但我保证很多读者会认为你好,没问题,我也会写这个!当然,也有一些人对这个问题感到困惑(什么是PHP)PHP被设计成一种简单易用的脚本语言。初学者可以学会在很短的时间内使用它。它还可以防止初学者犯上述错误。
让我们回到这个问题上来。在上面的代码中的问题是,你可以很容易地访问的访问权,而不需要提供正确的用户名和密码,添加授权= 1在浏览器的地址栏中结束。因为PHP会自动创建为每个提交的值的变量--不论是自动提交表单,URL查询字符串或一个cookie,这套1美元的授权,所以未经授权的用户也可以突破安全限制。
那么,我们怎样才能简单地解决这个问题呢只要在程序开始时默认情况下授权$被设置为false,这个问题就不存在了!授权$是完全在程序代码中创建的变量;但是为什么开发人员不得不担心每个恶意用户提交的变量呢
PHP 4.2做了什么
在PHP 4中。2、在新安装的PHP的register_globals选项是默认封闭,所以EGPCS值(EGPCS缩写是环境,得到后,饼干和服务器--这是在PHP的外部变量的源全系列)。它不会被创建为全局变量。当然,这个选项也可以手动打开,但是PHP开发人员建议您关闭它。为了实现它们的意图,您需要使用其他方法来获得这些值。
从PHP 4.1,EGPCS价值可以从一组指定的数组中获得。
_env美元--包括系统环境变量
_get美元--查询字符串中的变量,方法是把形式提交的变量
_post美元——在一个以邮件的形式提交的变量
_cookie美元——包括所有的Cookie变量
_server美元--包括服务器变量,如http_user_agent
_request美元--包含所有_get美元,_post美元的内容,并_cookie美元
_session美元--包含所有注册会话变量
在PHP 4.1中,当开发商关闭register_globals选项(这也被认为是一种提高PHP的性能),我们必须把这些烦人的名字如http_get_vars美元获得这些变量,这些新变量不仅是短暂的,但他们有其他的优点。
首先,让我们重写PHP 4中提到的代码。2(即关闭register_globals选项)。
复制代码代码如下所示:
< PHP
_request {用户名为美元美元'username};
密码=美元美元_request { 'password};
检查用户名和密码。
如果($用户名= = 'kevin'and密码= =美元的秘密)
授权=真;
>
请输入您的用户名和密码:
方法
用户名:
密码:
如您所见,我所需要做的就是在代码的开头添加以下两行代码:
_request {用户名为美元美元'username};
密码=美元美元_request { 'password};
因为我们想要的用户名和密码是由用户提交,我们从$ _request阵列获取这些值。使用此阵列允许用户自由选择发货方式:通过URL查询字符串,例如允许用户自动进入他们的证书创建书签时,通过提交表单或通过cookie如果你想限制你只提交证书通过形式(更准确地说,通过HTTP POST请求),你可以使用$ _post阵列:
_post {用户名为美元美元'username};
密码=美元美元_post { 'password};
除了这两个变量的引入,在程序代码没有变化。register_globals选项的简单的关闭使开发人员更了解哪些数据是从外部(不可信)资源。
请注意,有一个小问题:PHP仍然是error_reporting e_all ~ e_notice用户名和密码默认设置,所以如果两值不提交,试图让这两个值不从$ _request阵列或阵列_post美元承担任何错误的信息。如果你没有你的PHP程序要求严格的错误检查,你需要添加一些代码,首先检查这些变量。
但是这意味着更多的投入吗
是的,在像这样的一个简单程序中,PHP 4.2的使用通常会增加输入量!
但严重的是,PHP的设计者并没有完全忽略你的痛苦。在这些新的数组中,有其他PHP变量没有的特殊特性,它们是完整的全局变量。这对你有什么帮助让我们从示例的扩展开始。
为了使网站中的多个页面使用用户名/密码的说法,我们写我们的用户认证程序,包括文件(ProtectMe。PHP)。
复制代码代码如下所示:
< PHP protectme.php / * * /
功能authorize_user(authuser美元,美元authpass)
{
_post {用户名为美元美元'username};
密码=美元美元_post { 'password};
检查用户名和密码。
如果(用户名为$)!= authuser美元或美元的密码!= $ authpass):
>
请输入您的用户名和密码:
方法
用户名:
密码:
< PHP
出口();
Endif;
}
>
现在,我们刚刚看到的页面将是这样的。
复制代码代码如下所示:
< PHP
要求('protectme。php);
authorize_user(凯文秘密);
>
这很简单。很清楚,对吧它的时间来测试你的眼睛和经验-什么是不在authorize_user功能
没有声明_post美元是函数中的全局变量!在PHP 4中,当register_globals是开启的,你需要添加一行代码的函数得到$$的用户名和密码的变量:
功能authorize_user(authuser美元,美元authpass)
{
全局$用户名,$密码;
…
在PHP中,与其他语法相似的语言不同,函数以外的变量不能在函数中自动获得。您需要添加上面指定的行,以指定它来自全局范围。
在PHP 4中,当你闭上register_globals提供安全,你可以使用$ http_post_vars阵列获得表单提交的值,但是你仍然需要在全球范围内进口本阵。
功能authorize_user(authuser美元,美元authpass)
{
全球http_post_vars美元;
http_post_vars {用户名为美元美元'username};
密码=美元美元http_post_vars { 'password};
但在PHP 4.1和以后的版本中,美元的特殊_post变量(和上面提到的其他变量)可以用在所有的领域,这就是为什么它不需要声明,_post美元变量函数中的全局变量:
功能authorize_user(authuser美元,美元authpass)
{
_post {用户名为美元美元'username};
密码=美元美元_post { 'password};
这与会话有什么关系
一个特殊_session美元阵列的引入实际上有助于简化会议代码。你不需要声明会话变量为全局变量,然后注意哪些变量是注册。你可以给你的所有会话变量_session {是} 'varname美元。
现在让我们看看另一个例子,用户认证一看。这一次,我们使用的会话标识用户继续停留在你的网站已经被验证。首先,让我们看一看在PHP版本4(开放register_globals):
复制代码代码如下所示:
< PHP
session_start();
如果($用户名= = 'kevin'and密码= =美元的秘密)
{
授权=真;
session_register('authorized);
}
>
与初始程序一样,程序中存在安全漏洞。在URL的结尾,授权= 1可以绕过安全措施并直接访问页面内容。开发人员可以看到$作为会话变量被授权,而忽略了通过用户输入轻松设置相同变量的能力。
当我们把我们的特殊阵列(PHP 4.1)和关闭register_globals(PHP 4.2),我们的程序将是这样的:
复制代码代码如下所示:
< PHP
session_start();
如果($用户名= = 'kevin'and密码= =美元的秘密)
_session美元{ 'authorized} =真;
>
容易吗不再需要将普通变量注册为会话变量。你只需要设置会话变量直接($ _session阵列)和使用它们以同样的方式,程序也越来越短,没有混乱的会话变量是可变的!
总结
在本文中,我解释了PHP脚本语言变化的深层原因。在PHP 4.1中,添加了一组特殊数据来访问外部数据。这些数组可以在任何范围内调用,这使得对外部数据的访问更加方便。在PHP 4中。2、register_globals是默认关闭,鼓励这些阵列的使用以避免缺乏经验的开发者编写安全的PHP代码。
我怎么知道我是否没有试过呢
这里怎么了
请看下面的PHP脚本,它用于在输入用户名和密码正确时授权访问Web页面:
复制代码代码如下所示:
< PHP
检查用户名和密码。
如果($用户名= = 'kevin'and密码= =美元的秘密)
授权=真;
>
请输入您的用户名和密码:
方法
用户名:
密码:
好吧,我相信大约一半的读者会说得太愚蠢,我不会犯这样的错误!但我保证很多读者会认为你好,没问题,我也会写这个!当然,也有一些人对这个问题感到困惑(什么是PHP)PHP被设计成一种简单易用的脚本语言。初学者可以学会在很短的时间内使用它。它还可以防止初学者犯上述错误。
让我们回到这个问题上来。在上面的代码中的问题是,你可以很容易地访问的访问权,而不需要提供正确的用户名和密码,添加授权= 1在浏览器的地址栏中结束。因为PHP会自动创建为每个提交的值的变量--不论是自动提交表单,URL查询字符串或一个cookie,这套1美元的授权,所以未经授权的用户也可以突破安全限制。
那么,我们怎样才能简单地解决这个问题呢只要在程序开始时默认情况下授权$被设置为false,这个问题就不存在了!授权$是完全在程序代码中创建的变量;但是为什么开发人员不得不担心每个恶意用户提交的变量呢
PHP 4.2做了什么
在PHP 4中。2、在新安装的PHP的register_globals选项是默认封闭,所以EGPCS值(EGPCS缩写是环境,得到后,饼干和服务器--这是在PHP的外部变量的源全系列)。它不会被创建为全局变量。当然,这个选项也可以手动打开,但是PHP开发人员建议您关闭它。为了实现它们的意图,您需要使用其他方法来获得这些值。
从PHP 4.1,EGPCS价值可以从一组指定的数组中获得。
_env美元--包括系统环境变量
_get美元--查询字符串中的变量,方法是把形式提交的变量
_post美元——在一个以邮件的形式提交的变量
_cookie美元——包括所有的Cookie变量
_server美元--包括服务器变量,如http_user_agent
_request美元--包含所有_get美元,_post美元的内容,并_cookie美元
_session美元--包含所有注册会话变量
在PHP 4.1中,当开发商关闭register_globals选项(这也被认为是一种提高PHP的性能),我们必须把这些烦人的名字如http_get_vars美元获得这些变量,这些新变量不仅是短暂的,但他们有其他的优点。
首先,让我们重写PHP 4中提到的代码。2(即关闭register_globals选项)。
复制代码代码如下所示:
< PHP
_request {用户名为美元美元'username};
密码=美元美元_request { 'password};
检查用户名和密码。
如果($用户名= = 'kevin'and密码= =美元的秘密)
授权=真;
>
请输入您的用户名和密码:
方法
用户名:
密码:
如您所见,我所需要做的就是在代码的开头添加以下两行代码:
_request {用户名为美元美元'username};
密码=美元美元_request { 'password};
因为我们想要的用户名和密码是由用户提交,我们从$ _request阵列获取这些值。使用此阵列允许用户自由选择发货方式:通过URL查询字符串,例如允许用户自动进入他们的证书创建书签时,通过提交表单或通过cookie如果你想限制你只提交证书通过形式(更准确地说,通过HTTP POST请求),你可以使用$ _post阵列:
_post {用户名为美元美元'username};
密码=美元美元_post { 'password};
除了这两个变量的引入,在程序代码没有变化。register_globals选项的简单的关闭使开发人员更了解哪些数据是从外部(不可信)资源。
请注意,有一个小问题:PHP仍然是error_reporting e_all ~ e_notice用户名和密码默认设置,所以如果两值不提交,试图让这两个值不从$ _request阵列或阵列_post美元承担任何错误的信息。如果你没有你的PHP程序要求严格的错误检查,你需要添加一些代码,首先检查这些变量。
但是这意味着更多的投入吗
是的,在像这样的一个简单程序中,PHP 4.2的使用通常会增加输入量!
但严重的是,PHP的设计者并没有完全忽略你的痛苦。在这些新的数组中,有其他PHP变量没有的特殊特性,它们是完整的全局变量。这对你有什么帮助让我们从示例的扩展开始。
为了使网站中的多个页面使用用户名/密码的说法,我们写我们的用户认证程序,包括文件(ProtectMe。PHP)。
复制代码代码如下所示:
< PHP protectme.php / * * /
功能authorize_user(authuser美元,美元authpass)
{
_post {用户名为美元美元'username};
密码=美元美元_post { 'password};
检查用户名和密码。
如果(用户名为$)!= authuser美元或美元的密码!= $ authpass):
>
请输入您的用户名和密码:
方法
用户名:
密码:
< PHP
出口();
Endif;
}
>
现在,我们刚刚看到的页面将是这样的。
复制代码代码如下所示:
< PHP
要求('protectme。php);
authorize_user(凯文秘密);
>
这很简单。很清楚,对吧它的时间来测试你的眼睛和经验-什么是不在authorize_user功能
没有声明_post美元是函数中的全局变量!在PHP 4中,当register_globals是开启的,你需要添加一行代码的函数得到$$的用户名和密码的变量:
功能authorize_user(authuser美元,美元authpass)
{
全局$用户名,$密码;
…
在PHP中,与其他语法相似的语言不同,函数以外的变量不能在函数中自动获得。您需要添加上面指定的行,以指定它来自全局范围。
在PHP 4中,当你闭上register_globals提供安全,你可以使用$ http_post_vars阵列获得表单提交的值,但是你仍然需要在全球范围内进口本阵。
功能authorize_user(authuser美元,美元authpass)
{
全球http_post_vars美元;
http_post_vars {用户名为美元美元'username};
密码=美元美元http_post_vars { 'password};
但在PHP 4.1和以后的版本中,美元的特殊_post变量(和上面提到的其他变量)可以用在所有的领域,这就是为什么它不需要声明,_post美元变量函数中的全局变量:
功能authorize_user(authuser美元,美元authpass)
{
_post {用户名为美元美元'username};
密码=美元美元_post { 'password};
这与会话有什么关系
一个特殊_session美元阵列的引入实际上有助于简化会议代码。你不需要声明会话变量为全局变量,然后注意哪些变量是注册。你可以给你的所有会话变量_session {是} 'varname美元。
现在让我们看看另一个例子,用户认证一看。这一次,我们使用的会话标识用户继续停留在你的网站已经被验证。首先,让我们看一看在PHP版本4(开放register_globals):
复制代码代码如下所示:
< PHP
session_start();
如果($用户名= = 'kevin'and密码= =美元的秘密)
{
授权=真;
session_register('authorized);
}
>
与初始程序一样,程序中存在安全漏洞。在URL的结尾,授权= 1可以绕过安全措施并直接访问页面内容。开发人员可以看到$作为会话变量被授权,而忽略了通过用户输入轻松设置相同变量的能力。
当我们把我们的特殊阵列(PHP 4.1)和关闭register_globals(PHP 4.2),我们的程序将是这样的:
复制代码代码如下所示:
< PHP
session_start();
如果($用户名= = 'kevin'and密码= =美元的秘密)
_session美元{ 'authorized} =真;
>
容易吗不再需要将普通变量注册为会话变量。你只需要设置会话变量直接($ _session阵列)和使用它们以同样的方式,程序也越来越短,没有混乱的会话变量是可变的!
总结
在本文中,我解释了PHP脚本语言变化的深层原因。在PHP 4.1中,添加了一组特殊数据来访问外部数据。这些数组可以在任何范围内调用,这使得对外部数据的访问更加方便。在PHP 4中。2、register_globals是默认关闭,鼓励这些阵列的使用以避免缺乏经验的开发者编写安全的PHP代码。
我怎么知道我是否没有试过呢
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。