编程防注入安全实现程序代码,PHP防注入安全代码

比如以下一段登录的代码:

简述:/*************************   
说明:   
判断传递的变量中是否含有非法字符   
如$_POST、$_GET   
功能:防注入   
**************************/      

最常用见的可能就是

 代码如下

复制代码 代码如下:

首先将magic_quotes_gpc设置为On,display_errors设置为Off,如果id型,我们利用intval()将其转换成整数类型,如代码:
$id=intval($id);

if($l = @mysql_connect(‘localhost’, ‘root’, ‘123’)) or
die(‘数据库连接失败’);

<?php     

好了下面我来介绍php提交数据过滤的基本原则 

mysql_select_db(‘test’);

//要过滤的非法字符     
$ArrFiltrate=array(“‘”,”;”,”union”);     
//出错后要跳转的url,不填则默认前一页     
$StrGoUrl=””;     
//是否存在数组中的值     
function FunStringExist($StrFiltrate,$ArrFiltrate){     
foreach ($ArrFiltrate as $key=>$value){     
  if (eregi($value,$StrFiltrate)){     
    return true;     
  }     
}     
return false;     
}     

1)提交变量进数据库时,我们必须使用addslashes()进行过滤,像我们的注入问题,一个addslashes()也就搞定了。其实在涉及到变量取值时,intval()函数对字符串的过滤也是个不错的选择。

mysql_set_charset(‘utf8’);

//合并$_POST 和 $_GET     
if(function_exists(array_merge)){     
  $ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);     
}else{     
  foreach($HTTP_POST_VARS as $key=>$value){     
    $ArrPostAndGet[]=$value;     
  }     
  foreach($HTTP_GET_VARS as $key=>$value){     
    $ArrPostAndGet[]=$value;     
  }     
}     

2)在php.ini中开启magic_quotes_gpc和magic_quotes_runtime。magic_quotes_gpc可以把get,post,cookie里的引号变为斜杠。magic_quotes_runtime对于进出数据库的数据可以起到格式话的作用。其实,早在以前注入很疯狂时,这个参数就很流行了。

$sql = ‘select * from test where username = “$username” and
password = “$password”‘;

//验证开始     
foreach($ArrPostAndGet as $key=>$value){     
  if (FunStringExist($value,$ArrFiltrate)){     
    echo “<script language=\”javascript\”>alert(\”非法字符\”);</script>”;     
    if (emptyempty($StrGoUrl)){     
    echo “<script language=\”javascript\”>history.go(-1);</script>”;     
    }else{     
    echo “<script language=\”javascript\”>window.location=\””.$StrGoUrl.”\”;</script>”;     
    }     
    exit;     
  }     
}     
?> 

3)在使用系统函数时,必须使用escapeshellarg(),escapeshellcmd()参数去过滤,这样你也就可以放心的使用系统函数。

$res = mysql_query($sql);

    

4)对于跨站,strip_tags(),htmlspecialchars()两个参数都不错,对于用户提交的的带有html和php的标记都将进行转换。比如尖括号”<“就将转化为
“<“这样无害的字符。

if(mysql_num_rows($res)){

保存为checkpostandget.php     
然后在每个php文件前加include(“checkpostandget.php“);即可     

 代码如下

header(‘Location:./home.php’);

方法2     

$new = htmlspecialchars(“<a href=’test’>Test</a>”,
ENT_QUOTES);
strip_tags($text,);

}else{

复制代码 代码如下:

5)对于相关函数的过滤,就像先前的include(),unlink,fopen()等等,只要你把你所要执行操作的变量指定好或者对相关字符过滤严密,我想这样也就无懈可击了。

die(‘输入有误’);

/* 过滤所有GET过来变量 */    
foreach ($_GET as $get_key=>$get_var)     
{     
if (is_numeric($get_var)) {     
  $get[strtolower($get_key)] = get_int($get_var);     
} else {     
  $get[strtolower($get_key)] = get_str($get_var);     
}     
}     

2、PHP简单的数据过滤

}

/* 过滤所有POST过来的变量 */    
foreach ($_POST as $post_key=>$post_var)     
{     
if (is_numeric($post_var)) {     
  $post[strtolower($post_key)] = get_int($post_var);     
} else {     
  $post[strtolower($post_key)] = get_str($post_var);     
}     
}     

1)入库:  trim($str),addslashes($str)
2)出库:  stripslashes($str)
3)显示:  htmlspecialchars(nl2br($str))

注意上面的sql语句,存在很大的安全隐患,如果使用以下万能密码和万能用户名,那么可以轻松进入页面:

/* 过滤函数 */    
//整型过滤函数     
function get_int($number)     
{     
    return intval($number);     
}     
//字符串型过滤函数     
function get_str($string)     
{     
    if (!get_magic_quotes_gpc()) {     
return addslashes($string);     
    }     
    return $string;     
}

分享一个实例

 代码如下

       

具体的代码:

  1. $sql = ‘select * from test where username = “***” and password =
    “***” or 1 = “1”‘;

您可能感兴趣的文章:

  • PHP中防止SQL注入实现代码
  • PHP+MySQL 手工注入语句大全
    推荐
  • discuz的php防止sql注入函数
  • php+mysql注入页面实现
  • 整理php防注入和XSS攻击通用过滤
  • Php中用PDO查询Mysql来避免SQL注入风险的方法
  • php中sql注入漏洞示例
    sql注入漏洞修复
  • 比较好用的PHP防注入漏洞过滤函数代码
  • php中addslashes函数与sql防注入
  • php中$_GET与$_POST过滤sql注入的方法
  • php使用exec
    shell命令注入的方法讲解
  • PHP针对伪静态的注入总结【附asp与Python相关代码】

 代码如下

很明显,针对这条sql语句的万能密码是: ***” or 1 = “1

<?php
   //security.php
/**
 * @author zhengwei
 * @copyright 2007
 */

 代码如下

/*
函数名称: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);    // 进行过滤 

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

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

 
/*
函数名称: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. $sql = ‘select * from test where username =”***” union select *
    from users/* and password = “***”‘;

foreach ($_POST as $post_key=>$post_var)
{
 if (is_numeric($post_var)) {
  $post[strtolower($post_key)] = get_int($post_var);
 } else {
  $post[strtolower($post_key)] = get_str($post_var);
 }
}

正斜线* 表示后面的不执行,mysql支持union联合查询,
所以直接查询出所有数据; 所以针对这条sql语句的万能用户名是:***” union
select * from users/*

/* 过滤函数 */
//整型过滤函数
function get_int($number)
{
    return intval($number);
}
//字符串型过滤函数
function get_str($string)
{
    if (!get_magic_quotes_gpc()) {
 return addslashes($string);
    }
    return $string;
}

 但是,此注入只针对代码中的sql语句,如果

?>

 代码如下

在有些cms中我会看到

$sql = “select * from test where username = $username and password =
$password”;

foreach($HTTP_POST_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
foreach($HTTP_GET_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}

上面的注入至少已经不管用了,不过方法是一样的;

 

在使用PDO之后,sql注入完全可以被避免,而且在这个快速开发的时代,框架横行,已然不用过多考虑sql注入问题了。

这个的代码然后在所有页面都加载这个函数,这样过滤个人发现好像上传文件时会有问题哦。

下面整理了两个防止sql注册函数

 代码如下

/* 过滤所有GET过来变量 */
foreach ($_GET as
$get_key=>$get_var)
{
if (is_numeric($get_var)) {
$get[strtolower($get_key)] = get_int($get_var);
} else {
$get[strtolower($get_key)] = get_str($get_var);
}
}
/* 过滤所有POST过来的变量 */
foreach ($_POST as $post_key=>$post_var)
{
if (is_numeric($post_var)) {
$post[strtolower($post_key)] = get_int($post_var);
} else {
$post[strtolower($post_key)] = get_str($post_var);
}
}
/* 过滤函数 */
//整型过滤函数
function get_int($number)
{
return intval($number);
}
//字符串型过滤函数
function get_str($string)
{
if (!get_magic_quotes_gpc()) {
return addslashes($string);
}
return $string;
}

还有一些博客会这样写

 代码如下

<?php  
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;
}
?>