快捷搜索:   nginx

脚本安全的本质 PHP+MYSQL(转)(2)



7   逻辑混乱:如果一个变量用在了if等逻辑语句中,那么很可能导致逻辑混乱问题,跳过一些语句的执行等等。



......种种其他的函数出现的问题


三   过滤与饶过过滤

     很多人已经注意到了这些安全问题,php中也包含了自己的安全机制,那就是GPC=On的时候加入了对'和"以及\的转义,很多的程序也都自己加入了这些转义。其他脚本语言可能没有这种机制,但是这种思路非常好。在被转义的情况下,他可以保证用户所有的输入都是字符串,无论这个变量进入哪里,包括sql查询,跨站脚本等等,但是有个很重要的前提就是你所书写的程序必须也把所有的输入都当作字符串来对待。很明显,如果有以下的2个语句:

$query = $db->query("select * from user where uid=$id");
$query = $db->query("select * from user where uid='$id'");

哪个更安全一点呢?第一个语句做的假设是$id是数字类型变量,第二个假设输入是字符类型变量所以使用''引用他。如果提交php?id=1 and 1=2对于第一个语句,最后变成:

select * from user where uid=1 and 1=2   //and 1=2成为了一个表达式
select * from user where uid='1 and 1=2' //and 1=2还是字符串的一部分

希望这个能给你一点提示,但不仅仅是sql注入!如果是跨站脚本漏洞的话,我们一样可以使用上面的思路,无论用户输入什么,在过滤好<>,然后只要把用户的输入当作一个字符串就行了,但是要注意,光一个转义字符\'在html里很可能还是有'的意义,你需要去掉他在html里的转义,用htmlspecialchars()函数,当然也要配合程序安全的代码,还是给两个例子:

echo "<img src=htmlspecialchars($url)>";
echo "<img src='htmlspecialchars($url)'>";

哪个是没有缺陷的呢?
     上面的例子是在暗示,一个变量如果只能作为字符串,就是不要赋予它特定的含义,它是做不了什么的。那么你可能已经想到了,对于上面提到的种种漏洞,如果迫不得已需要用户控制变量,那么你只要过滤掉特殊意义的字符,然后把输入只是作为一个字符串,那么就可以从代码级别上杜绝这些漏洞了。譬如对于fopen函数,只要我们过滤掉../以及..\这些字符,然后将用户输入的",'以及空字符等转义就没有问题了,对于写webshell的问题可以通过如果是建立数据库而已就可以转义掉<>脚本标记字符,如果产生的本身就是php文件那么可以将用户的输入限制在''或者在""之内,一切只是字符 ,跟跨站脚本的防御很相似吧!还有一些敏感字符可能是程序自己产生的,如下的代码:

$deldb=explode("|",$imgdb['icon']);

就赋予了$imgdb['icon']神圣的意义,所以我们在处理的时候一定先要将 $imgdb['icon'] 里的|清干净!


四   其他的问题

     我上面所说的仅仅是在检测漏洞与修补漏洞时的一些想法, 从函数着手分析变量的处理,但更多的时候程序的安全还是要依靠程序员清晰的思路的,但安全不仅仅是这样,譬如GBK和Big5的编码问题,还有上传等问题。Php脚本是这样,其他的脚本也是这样
顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论