设为首页 加入收藏

TOP

golang 防SQL注入 基于反射、TAG标记实现的不定参数检查器(二)
2019-01-07 12:08:58 】 浏览:1320
Tags:golang SQL 注入 基于 反射 TAG 标记 实现 不定 参数 检查
for i := 0; i < FieldValue.Len(); i++ { addMsg, ret = Recursioner(FieldValue.Index(i), fmt.Sprintf("%s[%d]", Path, i), FieldName) if ret != 0 { return } } case reflect.Map: for _, key := range FieldValue.MapKeys() { addMsg, ret = Recursioner(FieldValue.MapIndex(key), fmt.Sprintf("%s[%s]", Path, formatAtom(key)), FieldName) if ret != 0 { return } } case reflect.Ptr: if FieldValue.IsNil() { fmt.Printf("%s = nil\n", Path) } else { addMsg, ret = Recursioner(FieldValue.Elem(), fmt.Sprintf("(*%s)", Path), FieldName) if ret != 0 { return } } case reflect.Interface: if FieldValue.IsNil() { fmt.Printf("%s = nil\n", Path) } else { fmt.Printf("%s.type = %s\n", Path, FieldValue.Elem().Type()) addMsg, ret = Recursioner(FieldValue.Elem(), Path+".value", FieldName) if ret != 0 { return } } default: // basic types, channels, funcs fmt.Printf("%s = %s\n", Path, formatAtom(FieldValue)) field_name := FieldValue.Type().Name() if field_name == "string" { //获取该属性的tag fmt.Println("tag_value=", FieldName) switch FieldName { case "alphaandnum": addMsg, ret = CheckAlphaAndNum(CheckAlphaAndNumLen, formatAtom(FieldValue)) if ret != 0 { return } case "email": addMsg, ret = CheckEmail(CheckEmailLen, formatAtom(FieldValue)) if ret != 0 { return addMsg, ret } case "num": addMsg, ret = CheckNum(CheckNumLen, formatAtom(FieldValue)) if ret != 0 { return } } fmt.Println() } } return }

  

 

  

下面这个函数,格式化数据。

func formatAtom(FieldValue reflect.Value) string {
	switch FieldValue.Kind() {
	case reflect.Invalid:
		return "invalid"

	case reflect.String:
		return FieldValue.String()

	case reflect.Int, reflect.Int8, reflect.Int16,
		reflect.Int32, reflect.Int64:
		return strconv.FormatInt(FieldValue.Int(), 10)

	case reflect.Uint, reflect.Uint8, reflect.Uint16,
		reflect.Uint32, reflect.Uint64, reflect.Uintptr:
		return strconv.FormatUint(FieldValue.Uint(), 10)

	// ...floating-point and complex cases omitted for brevity...
	case reflect.Bool:
		return strconv.FormatBool(FieldValue.Bool())

	case reflect.Chan, reflect.Func, reflect.Ptr, reflect.Slice, reflect.Map:
		return FieldValue.Type().String() + " 0x" +
			strconv.FormatUint(uint64(FieldValue.Pointer()), 16)

	default: // reflect.Array, reflect.Struct, reflect.Interface
		return FieldValue.Type().String() + " value"
	}
}

  

具体的字段检查函数,我贴一个就好,意思到了就行。原理也很简单,用golang自带的map(java里是hashmap,python里的dict,之前做的芯片驱动层表项管理,也是hash)。

func CheckAlphaAndNum(lenLimit int, str string) (addMsg string, ret int) {
	ret = 0
	var lenStr int = len(str)
	if lenStr > lenLimit {
		ret = -1
		return
	}
	for i := 0; i < lenStr; i++ {
		r := str[i]
		if _, ok := CheckAlphaAndNumMap[r]; !ok {
			ret = -1
			addMsg = "字母数字组合类型字符串包含非法字符,请检查!"
			return
		}
	}
	return
}

  

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Mysql学习(一)添加一个新的用户并.. 下一篇PHP和Go中的闭包变量作用域

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目