欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【PHP中的代码安全和SQL Injection防范】,下面是详细的分享!
PHP中的代码安全和SQL Injection防范
在PHP编码的时候,如果考虑到一些比较基本的安全问题,首先一点:
1. 初始化你的变量
为什么这么说呢?我们看下面的代码:
| 以下为引用的内容: if ($admin) { echo '登陆成功!'; include('admin.php'); } else { echo '你不是管理员,无法进行管理!'; } |
好,我们看上面的代码好像是能正常运行,没有问题,那么加入我提交一个非法的参数过去呢,那么效果会如何呢?比如我们的这个页是 http://www.traget.com/login.php,那么我们提交:http://www.target.com/login.php?admin=1,呵呵,你想一些,我们是不是直接就是管理员了,直接进行管理。
当然,可能我们不会犯这么简单错的错误,那么一些很隐秘的错误也可能导致这个问题,比如最近暴出来的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) |
那么这时候你再提交 http://www.target.com/login.php?admin=1 就不好使了,因为我们在一开始就把变量初始化为 $admin=0 了,那么你就无法通过这个漏洞获取管理员权限。
2. 防止SQL Injection (sql注射)
SQL 注射应该是目前程序危害最大的了,包括最早从asp到php,基本上都是国内这两年流行的技术,基本原理就是通过对提交变量的不过滤形成注入点然后使恶意用户能够提交一些sql查询语句,导致重要数据被窃取、数据丢失或者损坏,或者被入侵到后台管理。
基本原理我就不说了,我们看看下面两篇文章就很明白了:
http://www.4ngel.net/article/36.htm
http://www.4ngel.net/article/30.htm
那么我们既然了解了基本的注射入侵的方式,那么我们如何去防范呢?这个就应该我们从代码去入手了。
我们知道Web上提交数据有两种方式,一种是get、一种是post,那么很多常见的sql注射就是从get方式入手的,而且注射的语句里面一定是包含一些sql语句的,因为没有sql语句,那么如何进行,sql语句有四大句:
select 、update、delete、insert,那么我们如果在我们提交的数据中进行过滤是不是能够避免这些问题呢?
于是我们使用正则就构建如下函数:
| 以下为引用的内容:
|
我们函数里把 select,insert,update,delete, union, into, load_file, outfile
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 的时候,那么提交的不符合数据库规则的数据都是不会自动在前面加' \ '的,那么我们要控制这些问题,于是构建如下函数:
| 以下为引用的内容: 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,我们又一次的避免了服务器被沦陷的危险。
最后,再考虑提交一些大批量数据的情况,比如发贴,或者写文章、新闻,我们需要一些函数来帮我们过滤和进行转换,再上面函数的基础上,我们构建如下函数:
| 以下为引用的内容: 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. 一定记得要过滤你的变量。
以上所分享的是关于PHP中的代码安全和SQL Injection防范,下面是编辑为你推荐的有价值的用户互动:
相关问题:php防sql注入的代码
答://POST过滤安全 $_POST=check_input($_POST); function check_input($value) { if(get_magic_quotes_gpc()){ $value = htmlspecialchars(trim($value)); } else { $value = addslashes(htmlspecialchars(trim($value))); } return $value; } 另... >>详细
相关问题:防止sql注入的php代码!
答: 给你个参考 >>详细
相关问题:php如何防止sql注入
答:额,这是我老师给的答案 过滤一些常见的数据库操作关键字, select ,insert,update,delete,and,*等或通过系统函数addslashes对内容进行过滤 php配置文件中register_globals=off;设置为关闭状态.(作用将注册全局变量关闭);如接收POST表单的值... >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
