最近一直在忙活HCC的新服务器(LAMP!!!),一直在看一些关于安全之类的文章。可是,服务器再安全,如果上面的php/asp等脚本存在漏洞,那也是白忙活。下面,我总结了php常见的几个漏洞(asp等的漏洞也都类似,可以参考)以及防范措施。
漏洞1.SQL注入这真是极其耳熟能详的漏洞了,曾经害过无数网站。不过,自从php有了“魔术引用”(Magic Quotes),SQL注入可是尝不到任何甜头了。但是,防范于未然,万一人家php版本低呢。可以编这么一个函数来防范:
01 <?php
02 function escape_data ($data)
03 {
04 if (ini_get('magic_quotes_gpc'))
05 {
06 $data = stripslashes($data); //抵消Magic Quotes
07 }
08 if (function_exists('mysql_real_escape_string'))
09 {
10 global $dbc;
11 $data = mysql_real_escape_string
(trim($data), $dbc);
12 }
13 else
14 {
15 $data = mysql_escape_string(trim($data));
16 }
17 return $data;
18 }
19 ?>
说明一下,mysql_real_escape_string可以根据数据库链接判断字符集,更加安全,但只在较新版本的php中有。
只要将每一个数据库查询语句使用一下这个函数,基本就安全了。或者,更完美的话,可以再用正则表达式检验一下。
当然,还要注意,尽量给用户开放最小的权限。这样,即使被注入了,损失也是有限的。
漏洞2.XSS,跨站脚本观察如下代码:
1 <?php
2 $name = $_GET['name'];
3 if isset($name)
4 {
5 echo "Hello, $name";
6 }
7 ?>
试想,如果别有用心的人将name写成一些HTML代码,后果将不堪设想。
不过,防范的方法还是比较简单的,只要用htmlspecialchars这个函数就可以了。
漏洞3.错误信息过于详尽观察如下代码:
01 <?php
02 $result = @mysql_query($query);
03 if ($result) { /* Do something... */ }
04 else
05 {
06 echo 'System error ... ';
07 // ...
08 echo 'Error:' . mysql_error();
09 // ...
10 echo 'Query:' . $query;
11 }
12 ?>
有时,为了调试的方便,将错误信息写得十分详尽。比如说将数据库连接的语句都写出来了。这在网站发布后是不可想象的,需要注意。
呵,这就是我总结的一些常见的漏洞,大家可以留言补充。