php安全之防注入详细介绍
发布:smiling 来源: PHP粉丝网 添加日期:2014-08-23 11:09:29 浏览: 评论:0
我们知道Web上提交数据有两种方式,一种是get、一种是post,那么很多常见的sql注射就是从get方式入手的,而且注射的语句里面一定是包含一些sql语句的,因为没有sql语句,那么如何进行,sql语句有四大句:select、update、delete、insert.
那么我们如果在我们提交的数据中进行过滤是不是能够避免这些问题呢?于是我们使用正则就构建如下函数,代码如下:
- /*
- 函数名称:inject_check()
- 函数作用:检测提交的值是不是含有SQL注射的字符,防止注射,保护服务器安全
- 参 数:$sql_str: 提交的变量
- 返 回 值:返回检测结果,ture or false
- 函数作者:heiyeluren
- */
- //开源代码phpfensi.com
- 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 '提交的数据合法,请继续!';
- }
- ?>
假设我们提交URL为:a.php?id=1,那么就会提示:
"提交的数据合法,请继续!",如果我们提交 a.php?id=1%27 select * from tb_name,就会出现提示:"你提交的数据非法,请检查后重新提交!",那么就达到了我们的要求.
但是,问题还没有解决,假如我们提交的是 a.php?id=1asdfasdfasdf 呢,我们这个是符合上面的规则的,但是呢,它是不符合要求的,于是我们为了可能其他的情况,我们再构建一个函数来进行检查,代码如下:
- /*
- 函数名称: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 '提交的数据合法,请继续!';
- }
- ?>
好,问题到这里似乎都解决了,但是我们有没有考虑过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
- */
- //开源代码phpfensi.com
- 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;
- }
Tags: php安全 PHP防注入
相关文章
- ·php 安全register globals设置为TRUE的危害(2013-11-28)
- ·PHP安全之防止.inc配置信息暴露(2014-08-21)
- ·PHP 防注入安全实现程序代码(2014-08-23)
- ·php intval() 小数时安全漏洞分析(2014-08-23)
- ·php中一些安全隐藏代码总结(2014-08-23)
- ·PHP四大安全策略(2020-10-27)
- ·整理php防注入和XSS攻击通用过滤(2021-06-17)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)