国产服务器厂商排名,网站seo技巧,做网站 网上接单,wordpress登录vipPHP安全最大化 php中退出时清除session的问题 今天在做php项目的时候,需要增加安全退出的功能,也就是要求用户点安全退出时,执行清除session操作,并转到登录页.没想到在这个地方也小卡了一下. 出现的问题是当我点安全退出后转到登录… PHP安全最大化 php中退出时清除session的问题 今天在做php项目的时候,需要增加安全退出的功能,也就是要求用户点安全退出时,执行清除session操作,并转到登录页.没想到在这个地方也小卡了一下. 出现的问题是当我点安全退出后转到登录页,但这时如果在地址栏中输入某一个管理页面的地址,还是能进去,也就是说session并未清除.我在程序的 代码中已经使用了session_unregister()方法注销了session的变量.但还是有这个问题,问了下zw,他帮忙看了一阵也没解决了. 还是上网搜索吧,在一篇文章中 看到一段代码,他在session_unregister()后加了句session_destroy();试着也照他写的加了 session_destroy(),终于可以清除session了.我的理解是:session_unregister()方法只是注销session 变量,并未真正清除session,只有执行了session_destroy()才清除了一个session中的所有数据. 在现在各种黑客横行的时候如何实现自己php代码安全保证程序和服务器的安全是一个很重要的问题我随便看了下关于php安全的资料并不是很多至少比asp少多了呵呵于是就想写点东西来防止这些可能出现的情况。这里没有太深的技术含量我只是比较简单的谈了谈。(以下操作如无具体说明都是基于PHPMySQLApache的情况) 先来说说安全问题我们首先看一下两篇文章http://www.xfocus.net/articles/200107/227.html http://www.xfocus.net/articles/200107/228.html 上面文章是安全焦点上的关于PHP安全的文章基本上比较全面的介绍了关于PHP的一些安全问题。 在PHP编码的时候如果考虑到一些比较基本的安全问题首先一点1. 初始化你的变量 为什么这么说呢我们看下面的代码if ($admin){ echo 登陆成功; include(admin.php);}else{ echo 你不是管理员无法进行管理;} 好我们看上面的代码好像是能正常运行没有问题那么加入我提交一个非法的参数过去呢那么效果会如何呢比如我们的这个页是 http://www.traget.com/login.php那么我们提交http://www.target.com/login.php?admin1呵呵你想一些我们是不是直接就是管理员了直接进行管理。 当然可能我们不会犯这么简单错的错误那么一些很隐秘的错误也可能导致这个问题比如最近暴出来的phpwind 1.3.6论坛有个漏洞导致能够直接拿到管理员权限就是因为有个$skin变量没有初始化导致了后面一系列问题。 那么我们如何避免上面的问题呢首先从php.ini入手把php.ini里面的register_global off就是不是所有的注册变量为全局那么就能避免了。但是我们不是服务器管理员只能从代码上改进了那么我们如何改进上面的代码呢我们改写如 下$admin 0; // 初始化变量if ($_POST[admin_user] $_POST[admin_pass]){ // 判断提交的管理员用户名和密码是不是对的相应的处理代码 // ... $admin 1;}else{ $admin 0;} if ($admin){ echo 登陆成功; include(admin.php);}else{ echo 你不是管理员无法进行管理;} 那么这时候你再提交 http://www.target.com/login.php?admin1 就不好使了因为我们在一开始就把变量初始化为 $admin 0 了那么你就无法通过这个漏洞获取管理员权限。 2. 防止SQL Injection (sql注射) SQL 注射应该是目前程序危害最大的了包括最早从asp到php基本上都是国内这两年流行的技术基本原理就是通过对提交变量的不过滤形成注入点然后使恶意用户能够提交一些sql查询语句导致重要数据被窃取、数据丢失或者损坏或者被入侵到后台管理。基本原理我就不说了我们看看下面两篇文章就很明白了http://www.4ngel.net/article/36.htmhttp://www.4ngel.net/article/30.htm 那么我们既然了解了基本的注射入侵的方式那么我们如何去防范呢这个就应该我们从代码去入手了。 我们知道Web上提交数据有两种方式一种是get、一种是post那么很多常见的sql注射就是从get方式入手的而且注射的语句里面一定是包含一些sql语句的因为没有sql语句那么如何进行sql语句有四大句 select 、update、delete、insert那么我们如果在我们提交的数据中进行过滤是不是能够避免这些问题呢 于是我们使用正则就构建如下函数 /*函数名称inject_check()函数作用检测提交的值是不是含有SQL注射的字符防止注射保护服务器安全参 数$sql_str: 提交的变量返 回 值返回检测结果ture or false函数作者heiyeluren*/function inject_check($sql_str){ return eregi(select|insert|update|delete||/*|*|../|./|union|into|load_file|outfile, $sql_str); // 进行过滤 } 我们函数里把 select,insert,update,delete, union, into, load_file, outfile /*, ./ , ../ , 等等危险的参数字符串全部过滤掉那么就能够控制提交的参数了程序可以这么构建 ?phpif (inject_check($_GET[id])){ exit(你提交的数据非法请检查后重新提交);}else{ $id $_GET[id]; echo 提交的数据合法请继续;}? 假设我们提交URL为http://www.target.com/a.php?id1那么就会提示 提交的数据合法请继续 如果我们提交 http://www.target.com/a.php?id1 select * from tb_name 就会出现提示你提交的数据非法请检查后重新提交 那么就达到了我们的要求。 但是问题还没有解决假如我们提交的是 http://www.target.com/a.php?id1asdfasdfasdf 呢我们这个是符合上面的规则的但是呢它是不符合要求的于是我们为了可能其他的情况我们再构建一个函数来进行检查 /*函数名称verify_id()函数作用校验提交的ID类值是否合法参 数$id: 提交的ID值返 回 值返回处理后的ID函数作者heiyeluren*/function verify_id($idnull){ if (!$id) { exit(没有提交参数); } // 是否为空判断 elseif (inject_check($id)) { exit(提交的参数非法); } // 注射判断 elseif (!is_numeric($id)) { exit(提交的参数非法); } // 数字判断 $id intval($id); // 整型化 return $id;} 呵呵那么我们就能够进行校验了于是我们上面的程序代码就变成了下面的 ?phpif (inject_check($_GET[id])){ exit(你提交的数据非法请检查后重新提交);}else{ $id verify_id($_GET[id]); // 这里引用了我们的过滤函数对$id进行过滤 echo 提交的数据合法请继续;}? 好问题到这里似乎都解决了但是我们有没有考虑过post提交的数据大批量的数据呢 比如一些字符可能会对数据库造 成危害比如 _ , % 这些字符都有特殊意义那么我们如果进行控制呢还有一点就是当我们的php.ini里面的magic_quotes_gpc off 的时候那么提交的不符合数据库规则的数据都是不会自动在前面加 的那么我们要控制这些问题于是构建如下函数 /*函数名称str_check()函数作用对提交的字符串进行过滤参 数$var: 要处理的字符串返 回 值返回过滤后的字符串函数作者heiyeluren*/function str_check( $str ){ if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否打开 { $str addslashes($str); // 进行过滤 } $str str_replace(_, \_, $str); // 把 _过滤掉 $str str_replace(%, \%, $str); // 把 % 过滤掉 return $str; } OK我们又一次的避免了服务器被沦陷的危险。 最后再考虑提交一些大批量数据的情况比如发贴或者写文章、新闻我们需要一些函数来帮我们过滤和进行转换再上面函数的基础上我们构建如下函数 /*函数名称post_check()函数作用对提交的编辑内容进行处理参 数$post: 要提交的内容返 回 值$post: 返回过滤后的内容函数作者heiyeluren*/function post_check($post){ if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开 { $post addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤 } $post str_replace(_, \_, $post); // 把 _过滤掉 $post str_replace(%, \%, $post); // 把 % 过滤掉 $post nl2br($post); // 回车转换 $post htmlspecialchars($post); // html标记转换 return $post;} 呵呵基本到这里我们把一些情况都说了一遍其实我觉得自己讲的东西还很少至少我才只讲了两方面再整个安全中是很少的内容了考虑下一次讲更多包括php安全配置apache安全等等让我们的安全正的是一个整体作到最安全。 最后在告诉你上面表达的1. 初始化你的变量 2. 一定记得要过滤你的变量 posted on 2013-03-04 18:02 林中侠客 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/luojianqun/archive/2013/03/04/2943189.html