字符串操作-摘自精通脚本黑客
trim()函数可以除去字符串开始位置和结束位置的空格, 并将结果字符串返回。默认情况下,除去的字符是换行符和回车符(\n 和\r)、 水平和垂直制表符(\t 和\x0B)、 字符串结束符(\0)和空格。
对于输入的字符串来说,某些字符肯定是有效的。但是对于我们黑客来说,就是要往里面输入一些具有特殊功能的字符。但是 PHP 为了防止用户输入的数据具有某个功能,提供了转义字符串函数。这些转义字符串函数将字符串转义就是在她们前面加上一个反斜杠。例如, "(双引号)就边成了\"(反斜杠双引号);\(反斜杠)就变成了\\(反斜杠反斜杠)。这个规则对所有的特殊字符都通用,所以如果在字符串中存在\\字符, 就需要用\\\\进进行替换,而实现这个功能的函数就是 addslshes(),它的使用方法如:$name= addslshes($name); 和许多字符串函数一样,addslshes()函数需要一个字符串作为输入参数,经过处理,将返回一个重新格式化后的字符串。也正是因为有了这个函数的出现,PHP的安全性得到了很大的提高,如果程序中使用了这个函数对用户输入的字符串进行处理了,那么我们几乎是不可能进行入侵了,这个函数可谓是黑客的天敌啊!而还有一个函数 stripslashes()的功能就是去掉这些斜杠的,功能和 addslshes()是相反的。 而在 php.ini 中还有一个叫做 magic_quotes_gpc 配置指令。如果它启用了的话,也就是说magic_quotes_gpc=true的话那么它就会实现addslshes()和stripslashes()这两个函数的功能。如今,在 PHP 的新版本中的默认情况下,该指令是启用的,这也使得新版的 PHP安全性得到了很大的提高。gpc 表示 GET、POST 和cookie,这就意味着来自这些方法和方式的变量将自动包括在引号内。使用 magic_quotes_gpc()函数可以检查系统上的指令是否已经启用。
在任何用于从 WEB访问数据库的脚本中,都应该遵循下面的基本步骤:
1) 检查并过滤来自用户的数据。
2) 建立一个到适当数据库的连接。
3) 对数据库进行各种操作,如查询操作。
4) 获取操作数据库的结果。
5) 将结果现实给用户。
而我们分析代码找漏洞最重要的就是第一步,寻找代码中那些数据系统没有过滤或过滤不完全,只要出现了没有过滤或过滤不完全的话,八成就会出现了安全问题,也就找到了一个漏洞了。
前面我已经给大家介绍了 magic_quotes_gpc 指令及 addslshes()和 stripslashes()这两个函数。如果一个安全意识比较高的程序员,他一般都会利用他们来过滤用户输入的数据,常见的过滤代码如下:
if (!magic_quotes_gpc())
{
$id = addslshes($id);
$name = addslshes($name);
}
前面也已经告诉大家了 magic_quotes_gpc()函数就是用来检测 magic_quotes_gpc 指令是否已经启用了。上面的代码首先是判断 magic_quotes_gpc 指令是否启用,如果没有启用的话就用 addslshes()函数对输入的数据进行转义。如果在一个系统中的所有参数都用这些给转义了,那我们找代码的漏洞几乎是没戏了。
PHP下数字注射漏洞
在 PHP 中要防止数字型注射漏洞是比较简单的,我们可以用到 PHP 自带的一些函数。例如使用转义字符串函数 addslashes(), 提交的变量中所有的 ' (单引号), " (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的转义字符。例如,我们输入$blogid=5',使用函数 addslashes()之后,它就会把$blogid=5'转换成$blogid=5\',这样我们的注射就根本没办法进行下去了,彻底的断绝了注射攻击。所以上面的代码,我们可以改成: $blogid= addslashes($_REQUEST[blogid]); //使用addslashes()函数对参数所有的单引号、双引号、反斜杠、and、空字符都进行转义
if (!isset($blogid)){
$blogid=1;
}
$query_sql="SELECT * FROM article where id='".$blogid."'";
$result=mysql_query($query_sql);
$pageurl = './?blogid='.$blogid;
那么使用了 addslashes()函数对输入的参数 blogid 转换之后,就可以彻底防止注入漏洞的存在。
还有一种办法也可以彻底断绝数字型注射漏洞,使用函数 intval()对输入的数据进行转换。该函数的作用是把数据进行强制转换成数字型,比如输入$blogid=5',使用函数intval($blogid),它就会把 5'强制性的转换成数字 5。使用该函数后,所有的数据都会被转换成数字。所以对于数字型参数,只要使用了这个函数那么不管参数是什么都被转换成数字。那么同样可以彻底防止数字型的注射攻击,所以上面的代码,我们还可以改成:
$blogid=intval($_REQUEST[blogid]);
//使用intval()函数对输入的参数值全部强制性转换成数字
if (!isset($blogid)){
$blogid=1;
}
$query_sql="SELECT * FROM article where id='".$blogid."'";
$result=mysql_query($query_sql);
$pageurl = './?blogid='.$blogid;