当前位置: 首页 > news >正文

最新SQL注入漏洞修复建议

点击星标,即时接收最新推文

82eff4e07b8de5dcddd63dd694d79fe2.png

本文选自《web安全攻防渗透测试实战指南(第2版)》

点击图片五折购书

b87472e56ffa55de99b139bbea892a18.gif

SQL注入漏洞修复建议

常用的SQL注入漏洞的修复方法有两种。

1.过滤危险字符

多数CMS都采用过滤危险字符的方式,例如,用正则表达式匹配union、sleep、load_file等关键字。如果匹配到,则退出程序。例如,80sec的防注入代码如下:

functionCheckSql($db_string,$querytype='select'){global$cfg_cookie_encode;$clean='';$error='';$old_pos= 0;$pos= -1;$log_file= DEDEINC.'/../data/'.md5($cfg_cookie_encode).'_safe.txt';$userIP= GetIP();$getUrl= GetCurUrl();//如果是普通查询语句,则直接过滤一些特殊语法if($querytype=='select'){$notallow1="[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}"; //$notallow2 = "--|/\*";if(preg_match("/".$notallow1."/i",$db_string)){
fputs(fopen($log_file,'a+'),"$userIP||$getUrl||$db_string||SelectBreak\r\n");exit("<font size='5' color='red'>Safe Alert: Request Error step 1 !</font>");}}//完整的SQL检查while(TRUE){$pos=strpos($db_string,'\'',$pos+ 1);if($pos=== FALSE){break;}$clean.=substr($db_string,$old_pos,$pos-$old_pos);while(TRUE){$pos1=strpos($db_string,'\'',$pos+ 1);$pos2=strpos($db_string,'\\',$pos+ 1);if($pos1=== FALSE){break;}elseif($pos2== FALSE ||$pos2>$pos1){$pos=$pos1;break;}$pos=$pos2+ 1;}$clean.='$s$';$old_pos=$pos+ 1;}$clean.=substr($db_string,$old_pos);$clean= trim(strtolower(preg_replace(array('~\s+~s'),array(' '),$clean)));//老版本的MySQL不支持Union,常用的程序里也不使用Union,但是一些黑客使用它,所以要检查它if(strpos($clean,'union') !== FALSE && preg_match('~(^|[^a-z])union($|[^[a-z])~s',$clean) != 0){$fail= TRUE;$error="union detect";}//发布版本的程序可能不包括“--”“#”这样的注释,但是黑客经常使用它们elseif(strpos($clean,'/*') > 2 ||strpos($clean,'--') !== FALSE ||strpos($clean,'#') !== FALSE){$fail= TRUE;$error="comment detect";}//这些函数不会被使用,但是黑客会用它来操作文件elseif(strpos($clean,'sleep') !== FALSE && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s',$clean) != 0){$fail= TRUE;$error="slown down detect";}elseif(strpos($clean,'benchmark') !== FALSE && preg_match('~(^|[^a-z])benchmark($|[^[a-z])~s',$clean) != 0){$fail= TRUE;$error="slown down detect";}elseif(strpos($clean,'load_file') !== FALSE && preg_match('~(^|[^a-z])load_file($|[^[a-z])~s',$clean) != 0){$fail= TRUE;$error="file fun detect";}elseif(strpos($clean,'into outfile') !== FALSE && preg_match('~(^|[^a-z])into\s+outfile($|[^[a-z])~s',$clean) != 0){$fail= TRUE;$error="file fun detect";}//老版本的MySQL不支持子查询,程序里可能也用得少,但是黑客可以使用它查询数据库敏感信息elseif(preg_match('~\([^)]*?select~s',$clean) != 0){$fail= TRUE;$error="sub select detect";}if(!empty($fail)){fputs(fopen($log_file,'a+'),"$userIP||$getUrl||$db_string||$error\r\n");exit("<font size='5' color='red'>Safe Alert: Request Error step 2!</font>");}else{return$db_string;}}

使用过滤的方式,可以在一定程度上防止出现SQL注入漏洞,但仍然存在被绕过的可能。

2.使用预编译语句

使用PDO预编译语句时需要注意的是,不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库中数据的增加、删除、修改、查询。示例代码如下:

<?php
$pdo=new PDO('mysql:host=127.0.0.1;dbname=test','root','root');
$stmt=$pdo->prepare('select * from user where id=:id');
$stmt->bindParam(':id',$_GET['id']);
$stmt->execute();
$result=$stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($result);
?>

43f13424f9322d07b696d29c6cc0c50e.gif

MS08067安全实验室视频号已上线

欢迎各位同学关注转发~

—  实验室旗下直播培训课程  —

5b056c36b6b6b7c101aa54131dc1afe9.png

d45f7516249b5cf8b3ea116cf3d19ec0.jpeg

2bf3d02ff59ed89cfcd57874fe97ae85.jpegd94cdb04328094f25666f64db6ad9b51.png

aa5793a229bcf438d8b5e5cb8e42a2b2.jpeg

4b529fc0b09d8424c5a9c703b99de4ae.jpeg

3ab2323e8c1fa8a1be4941473375efc5.jpeg

729c5320fc81076d79e1559440086b99.jpeg

35a15a1ad891410a8158464783540897.jpeg


和20000+位同学加入MS08067一起学习

9531962698d113bdc37a3baa8f605308.gif

http://www.lryc.cn/news/207194.html

相关文章:

  • 新人FPGA验证书籍推荐
  • TypeError: data.reduce is not a function:数据类型不匹配
  • 出租屋智能视频监控系统方案:全面保卫租客安全
  • 代码解读-自然语言处理
  • docker指令
  • 【MySql】9- 实践篇(七)
  • Maven compile时报错 系统资源不足,出现OOM:GC overhead limit exceeded
  • 启动内核ip转发和其他优化
  • 信息安全技术
  • SQL 选择数据库 USE语句
  • FL Studio21版无限破解版下载 软件内置破解补丁
  • 【代码随想录】算法训练计划02
  • hive针对带有特殊字符非法json数据解析
  • 【C++进阶之路】第三篇:二叉搜索树 kv模型
  • 【Oracle】Navicat Premium 连接 Oracle的两种方式
  • 在python里如何实现switch函数的功能
  • Python 继承和子类示例:从 Person 到 Student 的演示
  • DevOps持续集成-Jenkins(3)
  • TypeScript之索引签名
  • k8s-----24、亲和力Affinity
  • 860. 柠檬水找零
  • Flink将数据写入MySQL(JDBC)
  • react-typescript-demo
  • Alexon:在云原生环境中快速部署应用服务
  • 5G技术在职业教育领域的应用:产生巨变的技术
  • 【触想智能】工控一体机与5G物联网技术结合是未来发展趋势
  • LuatOS-SOC接口文档(air780E)--lvgl - LVGL图像库
  • LuatOS-SOC接口文档(air780E)--lora2 - lora2驱动模块(支持多挂)
  • WKWebView iOS17设置UserAgent
  • 持续集成部署-k8s-服务发现-Service