原文出处: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; } 希望这上面的介绍可以帮你解决你想解决的问题。
分享到:
相关推荐
本文实例讲述了php中$_GET与$_POST过滤sql注入的方法,分享给大家供大家参考。具体分析如下: 此函数只能过滤一些敏感的sql命令了,像id=1这种大家还是需要自己简单过滤了。 主要实现代码如下: 复制代码 代码如下:...
总之,理解和正确使用GET、POST、SESSION和SERVER变量对于PHP开发至关重要,它们构成了Web应用程序与用户交互的基础。同时,通过自定义工具如EzPageVar,可以进一步提高代码的可维护性和安全性。学习和熟练掌握这些...
在PHP编程中,了解HTTP请求方法,特别是GET、POST和REQUEST的作用至关重要,因为它们涉及到如何接收和处理客户端发送的数据。让我们深入探讨这三个变量的区别以及如何在实际应用中使用它们。 首先,`$_GET`变量用于...
magic_quotes_gpc可以把get,post,cookie里的引号变为斜杠。magic_quotes_runtime对于进出数据库的数据可以起到格式话的作用。其实,早在以前注入很疯狂时,这个参数就很流行了。 3)在使用系统函数时,必须使用...
函数代码:复制代码 代码如下://php 批量过滤post,get敏感数据 if (get_magic_quotes_gpc()) { $_GET = stripslashes_array($_GET); $_POST = stripslashes_array($_POST); } function stripslashes_array(&$array) ...
magic_quotes_gpc可以把get,post,cookie里的引号变为斜杠。magic_quotes_runtime对于进出数据库的数据可以起到格式话的作用。其实,早在以前注入很疯狂时,这个参数就很流行了。 3)在使用系统函数时,必须使用...
在PHP编程中,HTTP协议的两种主要方法POST和GET用于在客户端和服务器之间传输数据。它们是Web应用程序中数据交互的基础,特别是在动态网页和表单提交时。此文档主要探讨了如何在PHP中使用这两种方法以及相关的安全...
在PHP编程中,GET和POST是两种常见的HTTP请求方法,用于在客户端(通常是浏览器)与服务器之间传递数据。GET方式通常用于查询参数,而POST方式则适用于传递更复杂或敏感的信息,如表单数据。当你需要处理多个或者...
本文将详细探讨如何使用PHP过滤请求中的数据。 首先,我们来看标题提到的"php过滤请求中数据方法"。PHP提供了多种内置函数和库来帮助开发者处理这一任务,其中最常用的包括`filter_var()`函数和`filter_input()`...
与GET方式不同,POST请求的数据不会出现在URL中,而是包含在请求体中。这使得POST方式能处理大量数据或敏感信息,因为它们不会被浏览器记录或缓存。 2. **创建POST表单** 在HTML中,通过`<form>`标签可以创建一个...
在了解PHP过滤器的实现代码之前,首先需要明确数据过滤和验证的重要性。随着网络环境的发展,用户与网站的交互变得更加频繁,用户不仅是信息的接收者,也是内容的创造者。因此,如何有效地验证用户提交的数据,确保...
3. `filter_input()`:这个函数获取一个特定类型的输入变量(如GET、POST或COOKIE),并对它进行过滤。这在处理用户请求时非常有用。 4. `filter_input_array()`:与`filter_var_array()`类似,但针对输入变量,...
- 在进行安全处理时,需要过滤和验证POST和GET数据,防止XSS、SQL注入等攻击。 总结,GET和POST方法在处理URL参数和表单数据时各有特点,理解它们的差异对于编写健壮的Web应用程序至关重要。开发者应根据实际需求...
标签中的其他元素如“get”、“post”和“st”(可能是“server-side”的简写)都与PHP中的服务器端处理相关。 总的来说,PHP提供多种方式来处理HTTP请求,包括直接使用预定义的超全局数组和使用cURL库。正确地处理...
在本文中,我们将深入探讨如何在ThinkPHP5.1框架中使用路由来处理GET和POST请求,以及如何在控制器和视图中实现简单的交互。首先,让我们了解什么是路由及其在框架中的作用。 **1. 路由简介** 在ThinkPHP5.1中,...
在PHP中,通常使用`$_POST`或`$_GET`全局变量来获取HTTP请求中的表单数据。然而,未经验证和过滤的用户输入可能包含危险字符,这些字符如果直接用于数据库查询或显示在网页上,可能会导致严重的安全问题。 1. **...
1. **数据不显示**:与GET请求不同,POST请求的数据不会出现在浏览器的URL地址栏中,这有助于保护敏感信息。 2. **无大小限制**:POST请求可以携带大量数据,而GET请求通常受限于URL长度。 3. **安全传输**:由于...
与`get_magic_quotes_gpc()` 不同的是,该功能可以在运行时动态开启或关闭。 **语法:** ```php bool get_magic_quotes_runtime ( void ) ``` - **返回值**:如果开启了Magic Quotes运行时转义,则返回TRUE;否则...