国产代码审计工具Pinpoint介绍

硬核国产代码审计工具Pinpoint介绍

简介

Pinpoint是由国内源伞科技所研制的一款静态代码审计工具,源伞科技公司是香港科技大学安全实验室的众多博士创建的,产品集成了实验室多年的研究成果,在众多国际顶级学术会议上都发表了成果论文,在学术界有很大的影响。近几年源伞科技将静态代码检测产品Pinpoint成功商业化,目前产品已经比较成熟,能够方便的集成各种安全开发流程,操作界面流畅。能够直接扫描JAVA的二进制文件,在Java和c/c++两种语言上的分析能力十分强大,扫描速度普遍快于市面上现有的产品,且拥有众多国内一线互联网以及金融公司的安全开发实例经验,不仅能够输出工具产品,也能够提供安全开发的解决方案,在国内静态代码分析领域处于领先地位。

高精度高性能的定理证明分析器

众所周知,传统的静态代码扫描技术中,主要有以下四种分析和检查原理

  • 缺陷模式匹配
    事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行匹配,从而完成软件安全分析。优点:简单方便;缺点:需要内置足够多的缺陷模式,容易产生误报。

  • 类型推断/类型推断
    类型推断技术是指通过对代码中运算对象类型进行推理,从而保证代码中每条语句都针对正确的类型执行。

  • 模型检查
    建立于有限状态自动机的概念基础上。将每条语句产生的影响抽象为有限状态自动机的一个状态,再通过分析有限状态机达到分析代码目的。校验程序并发等时序特性。

  • 数据流分析
    从程序代码中收集程序语义信息,抽象成控制流图&#x

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pinpoint 的 DefaultSqlParser 类是用于解析 SQL 语句的工具类。它主要用于解析 SQL 语句中的表名、列名、条件语句等信息。解析过程中会涉及到正则表达式的使用。 下面是 DefaultSqlParser 类的源码解析: ``` public class DefaultSqlParser implements SqlParser { private static final String[] EMPTY_STRING_ARRAY = new String[0]; @Override public ParsedSql parse(String sql) { if (sql == null) { return new ParsedSql(EMPTY_STRING_ARRAY, EMPTY_STRING_ARRAY, false, false); } String newSql = SqlParsingUtils.removeComments(sql); newSql = SqlParsingUtils.replaceQuotationMark(newSql); List<String> parameters = new ArrayList<>(); StringBuilder parameterBuilder = new StringBuilder(); Set<String> tables = new LinkedHashSet<>(); Set<String> columns = new LinkedHashSet<>(); boolean inSingleQuoteString = false; boolean inDoubleQuoteString = false; boolean inParameter = false; int length = newSql.length(); for (int i = 0; i < length; i++) { char c = newSql.charAt(i); boolean isLast = (i + 1) == length; if (inSingleQuoteString) { if (c == '\'') { if (isLast || newSql.charAt(i + 1) != '\'') { inSingleQuoteString = false; } else { i++; } } } else if (inDoubleQuoteString) { if (c == '\"') { if (isLast || newSql.charAt(i + 1) != '\"') { inDoubleQuoteString = false; } else { i++; } } } else if (inParameter) { if (c == '?') { parameters.add(parameterBuilder.toString().trim()); parameterBuilder.setLength(0); inParameter = false; } else { parameterBuilder.append(c); } } else { if (c == '\'') { inSingleQuoteString = true; } else if (c == '\"') { inDoubleQuoteString = true; } else if (c == '?') { inParameter = true; } else if (c == ' ') { // skip } else if (c == ',') { // skip } else if (Character.isLetter(c) || c == '_') { // table name or column name int j = i + 1; for (; j < length; j++) { if (!(Character.isLetterOrDigit(newSql.charAt(j)) || newSql.charAt(j) == '_')) { break; } } String word = newSql.substring(i, j); String lowerCaseWord = word.toLowerCase(); if (SqlParsingUtils.TABLE_HINTS.contains(lowerCaseWord)) { // skip table hints } else if (SqlParsingUtils.QUERY_HINTS.contains(lowerCaseWord)) { // skip query hints } else if (SqlParsingUtils.TABLE_KEYWORDS.contains(lowerCaseWord)) { // table name i = j - 1; for (; j < length; j++) { if (newSql.charAt(j) == ' ' || newSql.charAt(j) == '\t') { continue; } else if (newSql.charAt(j) == '(') { i = j; break; } else { tables.add(word); break; } } } else { // column name columns.add(word); i = j - 1; } } } } return new ParsedSql(tables.toArray(new String[tables.size()]), columns.toArray(new String[columns.size()]), !parameters.isEmpty(), inParameter); } } ``` 其中,parse() 方法接收一个 SQL 语句作为参数,并返回 ParsedSql 对象,该对象包含解析后的表名、列名、参数等信息。 在解析过程中,首先会移除 SQL 语句中的注释和替换引号,然后遍历 SQL 语句的每个字符,根据不同的字符类型进行相应的处理。具体来说: - 如果当前字符在单引号字符串中,则跳过; - 如果当前字符在双引号字符串中,则跳过; - 如果当前字符是问号,则表示当前字符为参数,将 inParameter 标记设置为 true,并将参数添加到 parameters 集合中; - 如果当前字符是空格或逗号,则跳过; - 如果当前字符是字母或下划线,则表示当前字符为表名或列名。在往后遍历时,如果遇到空格或括号,则表示当前字符为表名,否则为列名; - 如果当前字符不属于上述任何一种类型,则跳过。 在解析过程中,还需要注意以下几点: - 如果 SQL 语句中出现了嵌套的单引号或双引号,则需要特殊处理; - 如果 SQL 语句中出现了注释,则需要移除; - 如果 SQL 语句中出现了参数,则需要将 inParameter 标记设置为 true,并将参数添加到 parameters 集合中; - 如果 SQL 语句中出现了表名或列名,则需要将其添加到 tables 或 columns 集合中。 最后,将解析得到的表名、列名、参数等信息封装到 ParsedSql 对象中,并返回即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值