2.1.?危险PHP函数
这些函数应该尽量避免使用它们
exec, system, ini_alter, readlink, symlink, leak, proc_open, popepassthru, chroot, scandir, chgrp, chown, escapeshellcmd, escapeshellarg, shell_exec, proc_get_status, max_execution_time, opendir,readdir, chdir ,dir, unlink,delete,copy,rename
2.1.1.?chdir()函数安全演示
$ cat chdir.php <pre class="brush:php;toolbar:false"><?phpecho "current:".getcwd();echo '<br />';chdir('/');echo "chdir:".getcwd();echo '<br />';$lines = file('etc/passwd');foreach ($lines as $line_num => $line) { echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";}?>
运行结果
current:/wwwchdir:/Line #0 : root:x:0:0:root:/root:/bin/bashLine #1 : daemon:x:1:1:daemon:/usr/sbin:/bin/shLine #2 : bin:x:2:2:bin:/bin:/bin/shLine #3 : sys:x:3:3:sys:/dev:/bin/shLine #4 : sync:x:4:65534:sync:/bin:/bin/syncLine #5 : games:x:5:60:games:/usr/games:/bin/sh
2.2.?隐藏PHP版本信息
?
expose_php Off
2.3.?隐藏PHP出错信息
display_errors = Off
同时开启error_log日志
error_log = php_errors.log
3.?开发于安全
3.1.?彻底解决目录于文件的安全
选择一个MVC开发框架,它们的目录结构一般是这样的:
/www/www/htdocs/index.php htdocs目录下只有一个index.php文件,他是MVC/HMVC框架入口文件/www/htdocs/static 这里防止静态文件 /www/app/ 这里放置php文件
然后放行index.php文件,在URL上不允许请求任何其他php文件,并返回404错误
3.2.?Session / Cookie安全
session.save_path 默认session 存储在/tmp, 并且一明文的方式将变量存储在以sess_为前缀的文件中
$ cat session.php <?phpsession_start();if(isset($_SESSION['views'])) $_SESSION['views']=$_SESSION['views']+1;else $_SESSION['views']=1;echo "Views=". $_SESSION['views'];?>
http://www.example.com/session.php 我们刷新几次再看看sess_文件中的变化
$ cat /tmp/sess_d837a05b472390cd6089fc8895234d1aviews|i:3;
经过侧记你可以看到session文件中存储的是明文数据,所以不要将敏感数据放到Session中,如果必须这样作。建议你加密存储的数据
有一个办法比较好,就是封装一下session.不再采用$_SESSION方式调用
Class Encrype{} Class Session extend Encrype { function set($key,$value,$salt){ $value = Encrype($value) $_SESSION[$key] = $value } function get($key){ return $_SESSION[$key] }}Class Cookie extend Encrype { function set($key,$value,$salt){ $value = Encrype($value) $_COOKIE[$key] = $value } function get($key){ return $_COOKIE[$key] }}
Cookie
cookie 也需要作同样的处理,上面代码仅供参考,未做过运行测试
3.3.?注入安全
SQL 注入
<?php $mysql_server_name="172.16.0.4"; $mysql_username="dbuser"; $mysql_password="dbpass"; $mysql_database="dbname"; $conn=mysql_connect($mysql_server_name, $mysql_username, $mysql_password); $strsql=""; if($_GET['id']){ $strsql="select * from `order` where id=".$_GET['id']; }else{ $strsql="select * from `order` limit 100"; } echo $strsql; [email protected]_db_query($mysql_database, $strsql, $conn); $row=mysql_fetch_row($result); echo '<font face="verdana">'; echo '<table border="1" cellpadding="1" cellspacing="2">'; echo "\n<tr>\n"; for ($i=0; $i<mysql_num_fields($result); $i++) { echo '<td bgcolor="#000F00"><b>'. mysql_field_name($result, $i); echo "</b></td>\n"; } echo "</tr>\n"; mysql_data_seek($result, 0); while ($row=mysql_fetch_row($result)) { echo "<tr>\n"; for ($i=0; $i<mysql_num_fields($result); $i++ ) { echo '<td bgcolor="#00FF00">'; echo "$row[$i]"; echo '</td>'; } echo "</tr>\n"; } echo "</table>\n"; echo "</font>"; mysql_free_result($result); mysql_close();
SHELL 命令注入
<?phpsystem("iconv -f ".$_GET['from']." -t ".$_GET['from']." ".$_GET['file'])