热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

应用系统安全加固之防SQL注入解决方法

前一段时间笔者在领导的安排下开发了一套针对IT系统维护人员的绩效考核知识管理系统,系统上线后经过几次调优系统运行正常。可惜美好的时光总是太短暂,2月份集团派国内做安全的厂商对企业信息化系统安全扫描,发现该系统存在SQL注入式漏洞、数据库提权安全漏洞、密码明文及附件上传安全隐患。领导限期对该系统进行安全整改工作,于是笔者对该系统加班加点进行了一系列的安全加固。应对措施如下:
前一段时间笔者在领导的安排下开发了一套针对IT系统维护人员的绩效考核知识管理系统,系统上线后经过几次调优系统运行正常。可惜美好的时光总是太短暂,2月份集团派国内做安全的厂商对企业信息化系统安全扫描,发现该系统存在SQL注入式漏洞、数据库提权安全漏洞、密码明文及附件上传安全隐患。领导限期对该系统进行安全整改工作,于是笔者对该系统加班加点进行了一系列的安全加固。
应对措施如下:
1)对于SQL注入式漏洞解决方案是这样的在用户对系统进行操作时首先进行非法字符校验;
2)对数据库提权漏洞问题:一、采取数据库系统账号与应用账号分离即创建应用程序需要访问的账号;二、采取收缩权限并设置指定IP地址可以远程访问数据库;
3)对用户密码进行加密保存;
4)上传附件校验有黑名单转变成白名单方式。
附相关代码如下:
1、防SQL注入代码如下所示(需要的网友直接拷贝后放在自己的工程直接编译后调用即可轻松实现防SQL注入):
package action;
public class StringUtil {
    public StringUtil() {
    }
    public static String replace(String str, String substr, String restr) {
        String[] tmp = split(str, substr);
        String returnstr = null;
        if (tmp.length != 0) {
            returnstr = tmp[0];
            for (int i = 0; i                 returnstr = dealNull(returnstr) + restr + tmp[i + 1];
        }
        return dealNull(returnstr);
    }
    public static String[] split(String source, String div) {
        int arynum = 0, intIdx = 0, intIdex = 0, div_length = div.length();
        if (source.compareTo("") != 0) {
            if (source.indexOf(div) != -1) {
                intIdx = source.indexOf(div);
                for (int intCount = 1;; intCount++) {
                    if (source.indexOf(div, intIdx + div_length) != -1) {
                        intIdx = source.indexOf(div, intIdx + div_length);
                        arynum = intCount;
                    } else {
                        arynum += 2;
                        break;
                    }
                }
            } else
                arynum = 1;
        } else
            arynum = 0;
        intIdx = 0;
        intIdex = 0;
        String[] returnStr = new String[arynum];
        if (source.compareTo("") != 0) {
            if (source.indexOf(div) != -1) {
                intIdx = (int) source.indexOf(div);
                returnStr[0] = (String) source.substring(0, intIdx);
                for (int intCount = 1;; intCount++) {
                    if (source.indexOf(div, intIdx + div_length) != -1) {
                        intIdex = (int) source
                                .indexOf(div, intIdx + div_length);
                        returnStr[intCount] = (String) source.substring(intIdx
                                + div_length, intIdex);
                        intIdx = (int) source.indexOf(div, intIdx + div_length);
                    } else {
                        returnStr[intCount] = (String) source.substring(intIdx
                                + div_length, source.length());
                        break;
                    }
                }
            } else {
                returnStr[0] = (String) source.substring(0, source.length());
                return returnStr;
            }
        } else {
            return returnStr;
        }
        return returnStr;
    }
    public static boolean sql_inj(String str) {
        String inj_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
        String inj_stra[] = split(inj_str, "|");
        for (int i = 0; i             if (str.indexOf(inj_stra[i]) >= 0) {
                return true;
                
            }
        }
        return false;
    }
    private static String dealNull(String str) {
        String returnstr = null;
        if (str == null)
            returnstr = "";
        else
            returnstr = str;
        return returnstr;
    }
//    public static void main(String[] args) {
//     if(sql_inj("test''")==true)
//        System.out.println("非法字符");
//     else
//     System.out.println("输入内容合法"); 
//        
//    }
}
2、MD5加密代码如下所示:
package action;
import java.security.MessageDigest;
/**
 *


 * Title:MD5加密和验证
 *


 * 
 *


 * Description:
 *


 * 
 *


 * Copyright: Copyright (c) 2006
 *


 * 
 *


 * Company:
 *


 * 
 * @author not attributable
 * @version 1.0
 */
public class MD5 {
 public MD5() {
 }
 /**
  * MD5加密 Computes the MD5 fingerprint of a string.
  * 
  * @return the MD5 digest of the input String
  */
 public static String compute(String inStr) {
  MessageDigest md5 = null;
  try {
   md5 = MessageDigest.getInstance("MD5");
  } catch (Exception e) {
   System.out.println(e.toString());
   e.printStackTrace();
   return "";
  }
  char[] charArray = inStr.toCharArray();
  byte[] byteArray = new byte[charArray.length];
  for (int i = 0; i    byteArray[i] = (byte) charArray[i];
  }
  byte[] md5Bytes = md5.digest(byteArray);
  StringBuffer hexValue = new StringBuffer();
  for (int i = 0; i    int val = ((int) md5Bytes[i]) & 0xff;
   if (val <16) {
    hexValue.append("0");
   }
   hexValue.append(Integer.toHexString(val));
  }
  return hexValue.toString();
 }
 /**
  * 验证MD5
  * 
  * @param compareStr
  *            String 要比较的字符串
  * @param md5Str
  *            String 加密后的字符串
  * @return boolean 验证通过返回true,否则返回false
  */
 public static boolean compare(String compareStr, String md5Str) {
  String computeStr = compute(compareStr);
  if (computeStr.equals(md5Str)) {
   return true;
  } else {
   return false;
  }
 }
 public static void main(String[] args) {
  System.out.println("aa:==" + compute("aa"));
  System.out.println(compare("aa", "4124bc0a9335c27f086f24ba207a4912"));
 }
}

推荐阅读
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 配置PHPStudy环境并使用DVWA进行Web安全测试
    本文详细介绍了如何在PHPStudy环境下配置DVWA( Damn Vulnerable Web Application ),并利用该平台进行SQL注入和XSS攻击的练习。通过此过程,读者可以熟悉常见的Web漏洞及其利用方法。 ... [详细]
  • 应对.avast后缀勒索病毒:全面指南
    本文详细介绍了.avast后缀勒索病毒的特性、感染途径、恢复方法及预防措施,旨在帮助用户有效应对这一威胁。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文介绍如何在 FireDAC 环境下实现 FDMEMTable 字段的自动获取,为开发人员提供便捷的数据处理方式。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
author-avatar
天蝎騎著豬狂奔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有