作为一个PHP程序员,特别是对于新手来说,互联网是非常危险的了解较少,有很多外部入侵时被困,他们不知道黑客入侵,提交入侵,上传漏洞、SQL注入、跨脚本攻击等等。作为最基本的预防措施,你需要付注意你的外部提交和做的第一安全机制来处理防火墙。

规则1:不要信任外部数据或输入

实现对Web应用安全的第一件事是,它不应该依靠外部数据,外部数据(外部数据)包括并非由PHP代码的程序员直接输入任何数据。在采取任何措施来确保安全,其他任何来源的任何数据,如获取变量,形成后,数据库、配置文件、会话变量或Cookie,是不可靠的。

例如,以下数据元素可以被认为是安全的,因为它们是用PHP设置的。

清单1。安全代码不够完善
复制代码代码如下所示:
myusername美元=tmyer;
arrayarrayusers美元=阵列('tmyer ','汤姆',汤米);
定义(问候,你好)。myusername美元);
>

但是,下面的数据元素是有缺陷的。

清单2。不安全的、有缺陷的代码
复制代码代码如下所示:
myusername = { 'username _post美元美元的}; / /污染!
arrayarrayusers美元=阵列(myusername美元,'汤姆','汤米'); / /污染!
定义(问候,你好)。myusername美元); / /污染!
>

为什么第一个变量$ myusername是错误的因为它直接来自形式后,用户可以输入该输入字段的任何字符串,包括恶意命令清除文件或运行之前上传的文件。你可能会问,不仅使用字母A-Z的客户端(Javascrīpt)形式的测试脚本来避免这危险的是,它始终是一个很好的一步,但在将任何形式的背后,任何人都可以下载到你自己的机器,修改它,然后重新提交任何他们需要的内容。

解决方法很简单:你把代码_post美元{ 'username}。如果不能,其他任何时间使用myusername美元(例如,在一个数组或常数)会污染这些对象。清理用户输入一个简单的方法是使用正则表达式来处理它。在这例如,只想接受信件。它可能会限制一个字符串到一个特定的字符数是一个好主意,或要求所有字母都是小写的。

清单3。使用用户输入变得安全
复制代码代码如下所示:
myusername美元= cleaninput($ _post { 'username}); / /清洁!
arrayarrayusers美元=阵列(myusername美元,'汤姆','汤米'); / /清洁!
定义(问候,你好)。myusername美元); / /清洁!
功能cleaninput($输入){ $清洁= strtolower($输入);
清洁= preg_replace( / / } { ^ A-Z,清洁);
清洁= substr($干净,0);返回的清洁;
}
>

规则2:禁用使安全难以实现的PHP设置

你知道你不能信任用户的输入,你也应该知道,你不应该相信PHP配置在机器的方式。例如,一定要禁用register_globals.if register_globals启用,一些粗心的事情可以做,比如使用$变量代替得到或相同的名字后的字符串。禁用此设置,PHP的力量你是正确的命名空间来正确的变量,使用变量的形式后,_post美元{ 'variable}应引用。这不会误解这个特定的变量作为一个cookie,会话,或变。

规则3:如果你不能理解它,你就不能保护它。

有些开发人员使用奇怪的语法,或者组织语句非常紧密,以形成简短但模糊的代码。这可能是有效的,但是如果你不理解代码在做什么,你就无法决定如何保护它。

清单4。使代码易于维护
复制代码代码如下所示:
/ /混淆代码
$输入=(isset($ _post { 'username ' }){ } _post美元'username:);
/ /没有混淆的代码
输入=;
如果(isset($ _post { 'username ' })){
输入= _post美元美元'username'} {;
其他{ }
输入=;
}

在第二个相对清晰的代码段中,很容易看出$输入有缺陷,需要进行清理才能安全处理。

规则4:纵深防御是一种新的法宝

本教程将说明如何用例子在线保护形式,而以PHP代码的必要措施处理形式。以同样的方式,即使PHP正则表达式是用来确保获取变量是完全数字化的,仍然可以采取措施确保SQL查询使用越狱的用户输入。深国防不仅仅是一个好主意,它可以确保你不会陷入严重的麻烦。现在的基本规律进行了探讨,第一个威胁是现在进行研究:SQL注入攻击。

-防止SQL注入攻击

在SQL注入攻击中,用户通过操作表单或GET查询字符串将信息添加到数据库查询中。例如,假设有一个简单的登录数据库。这个数据库中的每个记录都有一个用户名字段和一个密码字段。
复制代码代码如下所示:


登录



用户名

密码






这种形式接受用户的用户名和密码由用户输入并提交用户输入到一个名叫verify.php.in这个文件,PHP数据从登录表单,如下:

清单5。不安全PHP表单处理代码
复制代码代码如下所示:
< PHP
$ = 0;
用户名为美元美元用户_post { };
PW =美元美元_post { 'pw};
$ =从用户名为=的用户中选择计数(*)作为CTR
$用户名。密码=。1美元;
结果= mysql_query美元($ SQL);
而($data = mysql_fetch_object($结果)){
如果($ = > = 1){
他们可以输入应用程序!
$ = 1;
}
}
如果($){
_session美元{ 'loginokay} =真;
页眉(索引php);
其他{ }
页眉(登录php);
}
>

这个代码看起来没问题。你是否为全世界的数百个(甚至数千个)站点使用这个代码错在哪里,这是好是,记住不要信任用户的输入,没有任何用户的信息,这样的应用程序很容易受到攻击。特别是,有可能是任何类型的SQL注入攻击。例如,如果用户输入foo为用户名和进入或1= 1作为密码,下面的字符串实际上是通过PHP,然后传递给MySQL查询。
复制代码代码如下所示:
< PHP
$ =从用户名= =的用户中选择计数(*)
foo'and密码=或1= 1限1;
>

此查询返回的计数1的价值,所以PHP将允许访问。通过在密码字符串结束某些恶意的SQL注入,黑客可以伪装成一个合法用户。解决这个问题的办法是使用内置的mysql_real_escape_string()PHP作为任何一个用户输入的包装功能。这个功能是在一个字符串转义字符,字符串不得转让撇号和其他特殊字符和使MySQL根据特殊字符操作。清单7显示的代码与一个逃跑的过程。

清单7显示了带有转义过程的代码
复制代码代码如下所示:
< PHP
$ = 0;
用户名为美元美元用户_post { };
PW =美元美元_post { 'pw};
SQL =美元数量(*)为中心从用户,用户名为。mysql_real_
_string($用户名)。密码=。mysql_real_escape_string($ PW)。
限制1 ;
结果= mysql_query美元($ SQL);
而($data = mysql_fetch_object($结果)){
如果($ = > = 1){它们可以进入
应用!
$ = 1;
}
}
如果($){
_session美元{ 'loginokay} =真;
页眉(索引);
}
别的{
页眉();
}
>

使用mysql_real_escape_string()作为一个用户输入的包装,可以避免在用户输入的任何恶意的SQL注入。如果用户试图通过错误的密码通过SQL注入,以下查询将被传递到数据库:
复制代码代码如下所示:
select count(*)为中心从用户那里'foo'and用户名密码= =
或 1 = 1 限制1