唐山网站建设

设为主页 加入收藏 繁體中文

PHP中的代码安全和SQL Injection防范

核心提示:在现在各种黑客横行的时候,如何实现自己php代码安全,保证程序和服务器的安全是1个很重要的题目,我随便看了下关于php安全的资料,其实不是很多,最少比asp少多了....

在PHP编码的时候,假设考虑到1些比较基本的安全题目,首先1点:
1. 初始化你的变量

为甚么这么说呢?我们看下面的代码:

以下为援用的内容:
if ($admin)
{
    echo '登陆成功!';
    include('admin.php');
}
else
{
    echo '你不是治理员,没法进行治理!';
}

好,我们看上面的代码仿佛是能正常运行,没有题目,那末加进我提交1个非法的参数过往呢,那末效果会如何呢?比如我们的这个页是 http://www.traget.com/login.php,那末我们提交:http://www.target.com/login.php?admin=1,呵呵,你想1些,我们是否是直接就是治理员了,直接进行治理。
固然,可能我们不会犯这么简单错的毛病,那末1些很隐蔽的毛病也可能导致这个题目,比如最近暴出来的phpwind 1.3.6论坛有个漏洞,导致能够直接拿到治理员权限,就是由于有个$skin变量没有初始化,导致了后面1系列题目。

那末我们如何避免上面的题目呢?首先,从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?admin=1 就不好使了,由于我们在1开始就把变量初始化为 $admin = 0 了,那末你就没法通过这个漏洞获得治理员权限。


2. 避免SQL Injection (sql注射)

SQL 注射应当是目前程序危害最大的了,包括最早从asp到php,基本上都是国内这两年流行的技术,基本原理就是通过对提交变量的不过滤构成注进点然后使恶意用户能够提交1些sql查询语句,导致重要数据被盗取、数据丢失或破坏,或被进侵到后台治理。
基本原理我就不说了,我们看看下面两篇文章就很明白了:
http://www.4ngel.net/article/36.htm
http://www.4ngel.net/article/30.htm

那末我们既然了解了基本的注射进侵的方式,那末我们如何往防范呢?这个就应当我们从代码往进手了。

1 2 3 4 下1页

核心提示:在现在各种黑客横行的时候,如何实现自己php代码安全,保证程序和服务器的安全是1个很重要的题目,我随便看了下关于php安全的资料,其实不是很多,最少比asp少多了....

我们知道Web上提交数占有两种方式,1种是get、1种是post,那末很多常见的sql注射就是从get方式进手的,而且注射的语句里面1定是包括1些sql语句的,由于没有sql语句,那末如何进行,sql语句有4大句:
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 /*, ./ , ../ , ' 等等危险的参数字符串全部过滤掉,那末便可以够控制提交的参数了,程序可以这么构建:

以下为援用的内容:
if (inject_check($_GET['id']))
{
     exit('你提交的数据非法,请检查后重新提交!');
}
else
{
    $id = $_GET['id'];
    echo '提交的数据正当,请继续!';
}
?>

假定我们提交URL为:http://www.target.com/a.php?id=1,那末就会提示:
"提交的数据正当,请继续!"
假设我们提交 http://www.target.com/a.php?id=1' select * from tb_name
就会出现提示:"你提交的数据非法,请检查后重新提交!"

那末就到达了我们的要求。

但是,题目还没有解决,假设我们提交的是 http://www.target.com/a.php?id=1asdfasdfasdf 呢,我们这个是符合上面的规则的,但是呢,它是不符合要求的,因而我们为了可能其他的情况,我们再构建1个函数来进行检查:

以下为援用的内容:

/*
函数名称: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;
}

上1页 1 2 3 4 下1页

核心提示:在现在各种黑客横行的时候,如何实现自己php代码安全,保证程序和服务器的安全是1个很重要的题目,我随便看了下关于php安全的资料,其实不是很多,最少比asp少多了....

呵呵,那末我们便可以够进行校验了,因而我们上面的程序代码就变成了下面的:

以下为援用的内容:
if (inject_check($_GET['id']))
{
     exit('你提交的数据非法,请检查后重新提交!');
}
else
{
    $id = verify_id($_GET['id']);    // 这里援用了我们的过滤函数,对$id进行过滤
    echo '提交的数据正当,请继续!';
}
?>

好,题目到这里仿佛都解决了,但是我们有无考虑过post提交的数据,大批量的数据呢?
比如1些字符可能会对数据库造成危害,比如 ' _ ', ' % ',这些字符都有特殊意义,那末我们假设进行控制呢?还有1点,就是当我们的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,我们又1次的避免了服务器被沦陷的危险。

上1页 1 2 3 4 下1页

核心提示:在现在各种黑客横行的时候,如何实现自己php代码安全,保证程序和服务器的安全是1个很重要的题目,我随便看了下关于php安全的资料,其实不是很多,最少比asp少多了....

最后,再考虑提交1些大批量数据的情况,比如发贴,或写文章、新闻,我们需要1些函数来帮我们过滤和进行转换,再上面函数的基础上,我们构建以下函数:

以下为援用的内容:
/*
函数名称: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些情况都说了1遍,实在我觉得自己讲的东西还很少,最少我才只讲了两方面,再全部安全中是很少的内容了,考虑下1次讲更多,包括php安全配置,apache安全等等,让我们的安全正的是1个整体,作到最安全。

最后在告知你上面表达的:1. 初始化你的变量  2. 1定记得要过滤你的变量。

上1页 1 2 3 4 唐山网站建设www.fw8.net


TAG:数据,内容,题目,函数,变量
评论加载中...
内容:
评论者: 验证码: