设为首页 收藏本站
查看: 1963|回复: 0

[经验分享] php过滤get与post

[复制链接]

尚未签到

发表于 2017-3-25 13:46:20 | 显示全部楼层 |阅读模式
  原文出处:http://www.ttphp.com/a/PHPjiaocheng/2010/0827/285.html
  PHP中的代码安全和SQL Injection防范
  如何实现自己php代码安全
  
在PHP编码的时候,如果考虑到一些比较基本的安全问题,首先一点:
1. 初始化你的变量
  为什么这么说呢?我们看下面的代码:
if ($admin)
{
    echo '登陆成功!';
    include('admin.php');
}
else
{
    echo '你不是管理员,无法进行管理!';
}
  好,我们看上面的代码好像是能正常运行,没有问题,那么加入我提交一个非法的参数过去呢,那么效果会如何呢?比如我们的这个页是那么我们提交:http://www.ttphp.com/login.php?admin=1,呵呵,你想一些,我们是不是直接就是管理员了,直接进行管理。
当然,可能我们不会犯这么简单错的错误,那么一些很隐秘的错误也可能导致这个问题,比如最近暴出来的phpwind 1.3.6论坛有个漏洞,导致能够直接拿到管理员权限,就是因为有个$skin变量没有初始化,导致了后面一系列问题。
  
2. 防止SQL Injection (sql注射)
  SQL 注射应该是目前程序危害最大的了,包括最早从asp到php,基本上都是国内这两年流行的技术,基本原理就是通过对提交变量的不过滤形成注入点然后使恶意用户能够提交一些sql查询语句,导致重要数据被窃取、数据丢失或者损坏,或者被入侵到后台管理。
基本原理我就不说了
  那么我们既然了解了基本的注射入侵的方式,那么我们如何去防范呢?这个就应该我们从代码去入手了。
  我们知道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 /*, ./ , ../ , ' 等等危险的参数字符串全部过滤掉,那么就能够控制提交的参数了,程序可以这么构建:
  <?php  if (inject_check($_GET['id']))  {       exit('你提交的数据非法,请检查后重新提交!');  }  else {      $id = $_GET['id'];      echo '提交的数据合法,请继续!';  }  ?>  在创建一个比较完善的验证:
 
  /*  函数名称:verify_id()  函数作用:校验提交的ID类值是否合法  参        数:$id: 提交的ID值  返 回 值:返回处理后的ID  函数作者:heiyeluren  */ function verify_id($id=null)  {     if (!$id) { exit('没有提交参数!'); }    // 是否为空判断     elseif (inject_check($id)) { exit('提交的参数非法!'); }    // 注射判断     elseif (!is_numeric($id)) { exit('提交的参数非法!'); }    // 数字判断     $id = intval($id);    // 整型化        return  $id;  }    呵呵,那么我们就能够进行校验了,于是我们上面的程序代码就变成了下面的:
 
  <?php  if (inject_check($_GET['id']))  {       exit('你提交的数据非法,请检查后重新提交!');  }  else {      $id = verify_id($_GET['id']);    // 这里引用了我们的过滤函数,对$id进行过滤      echo '提交的数据合法,请继续!';  }  ?>   比如一些字符可能会对数据库造成危害,比如 ' _ ', ' % ',这些字符都有特殊意义,那么我们如果进行控制呢?还有一点,就是当我们的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;  }   希望这上面的介绍可以帮你解决你想解决的问题。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-355313-1-1.html 上篇帖子: php thumb 生成缩略图 下篇帖子: PHP处理在线用户
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表