SQL注入漏洞修复办法

2024-05-11 05:49:32

按照百度说法,SQL注入是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。其实就是就是提交精心构造的数据库语句,使其反馈一些有用的数据。说白了就是去欺骗数据库,假如只有web服务器的话,是没法进行SQL注入的。
    网上常用的注入手法有两种,一种是猜测,让数据库暴出用户名、密码等信息;另一种直接绕过认证,取得权限。相对应,要想修复此类漏洞,就必须禁止特殊数据的提交或将特殊提交的数据修改。
    下面是不同脚本语言下的防注入过滤代码,其实思想是一致的。

1、    PHP防注入过滤代码

/*************************
说明:        判断传递的变量中是否含有非法字符 如$_POST、$_GET 
功能:        防注入
使用方法:    将下列代码保存为ak,php,调用方式 在数据提交页加上include("ak.php");
**************************/

<?php
function dowith_sql($str)
//实现将特征码两边加.

$refuse_str="exec|and|or|select|update|from|where|order|by|*|delete|'|insert|into|values|create|table|

database|set|char|asc|cast|declare|<script|script|iframe|3bomb|c.js|;";
//定义防注入的字符
   $arr=explode("|",$refuse_str);
//将$refuse_str中的值单独取出
   for($i=0;$i<count($arr);$i++)
   {
     $replace="[".$arr[$i]."]";
     $str=str_replace($arr[$i],$replace,$str);
//在变量$str中搜索字符串$arr[$i],并将其替换为字符串[$replace]
   }
   return $str;
}
foreach ($_GET as $key=>$value)
//遍历获GET方法获得的参数$_GET的值传给$key,并赋值给$value
{
  $_GET[$key]=dowith_sql($value);
//将$value中的特征码处理传个$_GET[$key]
}
foreach ($_POST as $key=>$value)
{
  $_POST[$key]=dowith_sql($value);
}
?>

上面的防注入的方法只是防了GET与POST方法提交的数据,但是,WEB服务器读取数据的顺序是,先取GET中的数据,没有再去POST中的数据,没有还会再去COOKIES中的数据,上面的代码还没有防cookies注入。防cookies注入就比较简单了,cookies的id值一般只为阿拉伯数字,但是cookies注入必须得在id中构造代码,只要在获得参数UID后,对其进行过滤就可以了,代码如下:

<?php
if($_COOKIE['id']!=null) {
//判断cookies不为空
foreach ($_COOKIE['id'] as $key=>$id){
//读取cookies中的值
if (if_numeric($id)<0){
echo "<script language=\\"javascript\\">alert(\\"请不要输入非法字符!\\");</script>" history.go(-1);</script>"; 
}
}
?>

将上述代码保存为hk.php。所以在平时应用时,在网页上加上include("ak.php");与include("hk.php");

2、asp防注入过滤代码
'--------说明------------------
'使用方法:  在需要防注的页面头部用 <!--#Include File="sql2.asp"-->包含就可以了
'友情提示:把代码复制到CONN.asp(数据库连接文件) 那么,只要包含了CONN的所有文件都防注了

<%
Dim xf_Post,xf_Get,xf_In,xf_Inf,xf_Xh,xf_db,xf_dbstr
'自定义需要过滤的字串,用 "|" 分隔
xf_In = "'|;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
xf_Inf = split(xf_In,"|")
If Request.Form<>"" Then
For Each xf_Post In Request.Form

For xf_Xh=0 To Ubound(xf_Inf)
If Instr(LCase(Request.Form(xf_Post)),xf_Inf(xf_Xh))<>0 Then
Response.Write "<Script Language=JavaScript>alert('请不要在参数中包含非法字符尝试注入');</Script>"
Response.Write "非法操作!系统做了如下记录↓<br>"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
Response.Write "操作时间:"&Now&"<br>"
Response.Write "操作页面:"&Request.ServerVariables("URL")&"<br>"
Response.Write "提交方式:POST<br>"
Response.Write "提交参数:"&xf_Post&"<br>"
Response.Write "提交数据:"&Request.Form(xf_Post)
Response.End
End If
Next
Next
End If
If Request.QueryString<>"" Then
For Each xf_Get In Request.QueryString
For xf_Xh=0 To Ubound(xf_Inf)
If Instr(LCase(Request.QueryString(xf_Get)),xf_Inf(xf_Xh))<>0 Then
Response.Write "<Script Language=JavaScript>alert('请不要在参数中包含非法字符尝试注入');</Script>"
Response.Write "非法操作!系统已经给你做了如下记录↓<br>"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
Response.Write "操作时间:"&Now&"<br>"

Response.Write "操作页面:"&Request.ServerVariables("URL")&"<br>"
Response.Write "提交方式:GET<br>"
Response.Write "提交参数:"&xf_Get&"<br>"
Response.Write "提交数据:"&Request.QueryString(xf_Get)
Response.End
End If
Next
Next
End If
%>

同样,再将cookies防一下,代码加在数据提交页。

if(Request.Cookies["uid"]!=null)
{
uid=Request.Cookies["uid"].value;
isnumeric cooidesID = new isnumeric();
//这是一个类
if (cooidesID.reIsnumeric(ruid))
//如果是数字就运行下面的
{
string str="select * from userTable where id="+uid;
...
}
}

3、    JSP防注入过滤代码

<script language="javascript">
<!--
var url = location.search;
// 函数location.search作用是取?之后的参数值,取得 QueryString 部分
var re=/^?(.*)(select%20|insert%20|delete%20from%20|count(|drop%20table|update%20truncate%20|asc(|mid(|char(|xp_cmdshell|exec%20master|net%20localgroup%20administrators|"|:|net%20user||%20or%20)(.*)$/gi;
//定义特殊字符串
var e = re.test(url);
//test()字符串中是否有匹配正则表达式的子字符串。返回true或false。
if(e) {
    alert("地址中含有非法字符~");
    location.href="error.asp";
}
//-->
<script>

当然,我们也可以定义过滤函数,直接应用到用户名、密码等提交的数据参数上,函数如下:

function checkuseravoid(str){
var inj_str="‘|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
var sarray=new Array();
sarray=inj_str.split('|');
for (var i=0 ;i <inj_stra.length ;i++ ) {
if (str.indexOf(inj_stra)>=0)
return true;
}
return false;
}

4、C#防注入过滤代码

//这个例子里暂定为=号和号,可继续添加
bool CheckParams(params object[] args)
{
     string[] Lawlesses={"=",""};
     if(Lawlesses==null||Lawlesses.Length<=0)return true;

构造正则表达式,例:Lawlesses是=号和号,则正则表达式为 .*[=}].*
     另外,由于我是想做通用而且容易修改的函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;

     string str_Regex=".*[";
     for(int i=0;i< Lawlesses.Length-1;i++)
         str_Regex+=Lawlesses+"|";
     str_Regex+=Lawlesses[Lawlesses.Length-1]+"].*";
     //
     foreach(object arg in args)
     {
         if(arg is string)
//如果是字符串,直接检查
         {
             if(Regex.Matches(arg.ToString(),str_Regex).Count>0)
             return false;
         }
         else if(arg is ICollection)
//如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查
         {
             foreach(object obj in (ICollection)arg)
             {
                 if(obj is string)
                 {
                     if(Regex.Matches(obj.ToString(),str_Regex).Count>0)
                     return false;
                 }
             }
         }
     }
     return true;

转载于:https://blog.51cto.com/edsoki/542656

SQL注入漏洞修复办法相关推荐

  1. 关于ECSHOP中sql注入漏洞修复

    标签:ecshop sql注入漏洞修复 公司部署了一个ecshop网站用于做网上商城使用,部署在阿里云服务器上,第二天收到阿里云控制台发来的告警信息,发现ecshop网站目录下文件sql注入漏洞以及程 ...

  2. mysql sql注入漏洞修复_从Java角度修复SQL注入漏洞

    很多情况因为过滤不严导致很多网站存在sql注入,这里以用户登陆为例,简单举例 首先创建一个测试的数据库 比较基础,不写创建过程了 java代码如下: packagecn.basic.jdbc;impo ...

  3. 织梦Dedecms的album_add.php文件SQL注入漏洞修复方法

    dedecms的/dedecms/member/album_add.php文件中,对输入参数mtypesid未进行int整型转义,导致SQL注入的发生. 修复方法: 打开dedecms/member/ ...

  4. /plus/recommend.php sql注入漏洞,DedeCMS 全版本通杀SQL注入漏洞利用代码及工具 -

    DedeCMS 全版本通杀SQL注入漏洞利用代码及工具 目前官方最新版已修复该漏洞 V5.7.37 GBK正式版20140228常规更新补丁 http://www.dedecms.com/pl/ ht ...

  5. Sophos 修复 Cyberoam OS 中的 SQL 注入漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 Sophos 公司为 Cyberoam 防火墙和路由器发布热补丁,修复一个 SQL 注入漏洞. Sophos 在2014年收购防火墙和 ...

  6. album add.php 修复,dedecms SQL注入漏洞 member/album_add.php 修复

    dedecms的/dedecms/member/album_add.php文件中,对输入参数mtypesid未进行int整型转义,导致SQL注入的发生. 打开文件:/member/album_add. ...

  7. php sql漏洞修复,php sql注入漏洞与修复

    出于安全考虑,需要过滤从页面传递过来的字符. 通常,用户可以通过以下接口调用数据库的内容:URL地址栏.登陆界面.留言板.搜索框等. 轻则数据遭到泄露,重则服务器被拿下. 一.SQL注入的步骤 a) ...

  8. SQL 登录注入脚本_vBulletin再修复高危RCE和SQL注入漏洞

    上个月末,vBulletin刚发布了一个针对高危远程代码执行漏洞的补丁,又在最近发布了一个全新安全补丁,针对了软件中的另外3个严重漏洞. 此次牵涉的漏洞影响vBulletin 5.5.4及以前的版本, ...

  9. java 框架注入漏洞修复_Mybatis框架下易产生SQL注入漏洞的场景和修复方法

    一.Mybatis框架下易产生SQL注入漏洞的场景 在基于Mybatis框架的Java白盒代码审计工作中,通常将着手点定位在Mybatis的配置文件中.通过查看这些与数据库交互的配置文件来确定SQL语 ...

最新文章

  1. 点云深度学习的Pytorch框架
  2. oracle绑定变量赋值,Oracle教程之绑定变量
  3. 如何实施异构服务器的负载均衡及过载保护?
  4. 区间数计算之Python实现
  5. jQuery计算器插件
  6. (Oracle学习笔记) sql*plus命令
  7. 天谕手游里的NPC真的很好看,画风特别的靓,背景音乐是万茜唱的
  8. 基于Spring Boot不同的环境使用不同的配置方法
  9. java比较字符能用等于号码_Java字符串比较,==,等于,匹配,compareTo()之间的差异。...
  10. 深入linux中重定向及管道详解
  11. 将windows7安装到映像文件方法总结
  12. 怎么区分zh和ch_zh,ch,sh,和z,c,s怎么分辨?
  13. 基环树DP(bzoj 1040: [ZJOI2008]骑士)
  14. linux nmon 进程io,Linux服务器用iotop命令分析服务器磁盘IO情况
  15. python usb通信测试
  16. 数说CS|浙江大学计算机科学与技术学院是怎样的存在?
  17. 汇编语言程序设计51单片机
  18. protobuf 中 repeated fields 细节
  19. HTML frameset 标签 cols 属性
  20. mac pro M1(ARM)安装:centos8.0虚拟机

热门文章

  1. c++工作笔记001---c++相关零碎要点_endl、“\n”和‘\n’区别_extern int a关键字_-的意思_::的意思_指针和引用的区别
  2. SpringMVC工作总结001_SpringMVC拦截器(资源和权限管理)
  3. EJB3.0学习笔记---JMS/MDB/Pub/Sub/P2P
  4. volatile和原子操作
  5. python built-in cache (don't reinvent the wheel)
  6. tar:归档中找不到 tar: 由于前次错误,将以上次的错误状态退出
  7. Php 小视频存储,用PHP保存远程视频到本机电脑的小插件
  8. java 中生成文档_在Java中生成专业的公文文档
  9. Kafka 安装与部署(单机版)与kafkaDemo调试测试(包含JAVA Demo)
  10. python编程(multiprocessing库)