开发中php安全性考虑哪些

开发中php安全性要考虑哪些?
1、把握整站的结构 , 避免泄露站点敏感目录
在写代码之初 , 我也是像很多老源码一样 , 在根目录下放上index.php、register.php、login.php , 用户点击注册页面 , 就跳转到http://localhost/register.php 。并没有太多的结构的思想 , 像这样的代码结构 , 最大的问题倒不是安全性问题 , 而是代码扩展与移植问题 。
在写代码的过程中 , 我们常要对代码进行修改 , 这时候如果代码没有统一的一个入口点 , 我们可能要改很多地方 。后来我读了一点emlog的代码 , 发现网站真正的前端代码都在模板目录里 , 而根目录下就只有入口点文件和配置文件 。这才顿悟 , 对整个网站的结构进行了修改 。
网站根目录下放上一个入口点文件 , 让它来对整个网站所有页面进行管理 , 这个时候注册页面变成了http://localhost/?act=register , 任何页面只是act的一个参数 , 在得到这个参数后 , 再用一个switch来选择要包含的文件内容 。在这个入口点文件中 , 还可以包含一些常量的定义 , 比如网站的绝对路径、网站的地址、数据库用户密码 。以后我们在脚本的编写中 , 尽量使用绝对路径而不要使用相对路径(否则脚本如果改变位置 , 代码也要变) , 而这个绝对路径就来自入口点文件中的定义 。
当然 , 在安全性上 , 一个入口点文件也能隐藏后台地址 。像这样的地址http://localhost/?act=xxx不会暴露后台绝对路径 , 甚至可以经常更改 , 不用改变太多代码 。一个入口点文件也可以验证访问者的身份 , 比如一个网站后台 , 不是管理员就不允许查看任何页面 。在入口点文件中就可以验证身份 , 如果没有登录 , 就输出404页面 。
有了入口点文件 , 我就把所有非入口点文件前面加上了这句话:
<?php
if(!defined('WWW_ROOT'))
{
header("HTTP/1.1 404 Not Found");
exit;
}
?>
WWW_ROOT是我在入口点中定义的一个常量 , 如果用户是通过这个页面的绝对路径访问(http://localhost/register.php) , 我就输出404错误;只有通过入口点访问(http://localhost/?act=register) , 才能执行后面的代码 。
2、使用预编译语句 , 避免sql注入
注入是早前很大的一个问题 , 不过近些年因为大家比较重视这个问题 , 所以慢慢变得好了很多 。
吴翰清在web白帽子里说的很好 , 其实很多漏洞 , 像sql注入或xss , 都是将“数据”和“代码”没有区分开 。“代码”是程序员写的内容 , “数据”是用户可以改变的内容 。如果我们写一个sql语句select * from admin where username='admin' password='xxxxx', admin和xxxxx就是数据 , 是用户输入的用户名和密码 , 但如果没有任何处理 , 用户输入的就可能是“代码” , 比如'or ''=' , 这样就造成了漏洞 。“代码”是绝对不能让用户接触的 。
在php中 , 对于MySQL数据库有两个模块 , mysql和mysqli , mysqli的意思就是mysql improve 。mysql的改进版 , 这个模块中就含有“预编译”这个概念 。像上面那个sql语句 , 改一改:select * from admin where username='?' password='?' , 它就不是一个sql语句了 , 但是可以通过mysqli的预编译功能先把他编译成stmt对象 , 在后期用户输入账号密码后 , 用stmt->bind_param将用户输入的“数据”绑定到这两个问号的位置 。这样 , 用户输入的内容就只能是“数据” , 而不可能变成“代码” 。
这两个问号限定了“数据”的位置 , 以及sql语句的结构 。我们可以把我们所有的数据库操作都封装到一个类中 , 所有sql语句的执行都进行预编译 。这样就完全避免了sql注入 , 这也是吴翰清最推荐的解决方案 。
下面是使用mysqli的一些代码部分(所有的判断函数运行成功或失败的代码我都省略了 , 但不代表不重要):
【开发中php安全性考虑哪些】


推荐阅读