123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- package utils
- import (
- "crypto/md5"
- cryptoRand "crypto/rand"
- "encoding/hex"
- "fmt"
- "github.com/dchest/captcha"
- "io"
- "math/rand"
- "strings"
- "time"
- )
- func FilterXSS(str string) string {
- str = strings.Replace(str, "<", "<", -1)
- str = strings.Replace(str, ">", ">", -1)
- str = strings.Replace(str, "%3C", "<", -1)
- str = strings.Replace(str, "%3E", ">", -1)
- str = strings.Replace(str, "expression", "expression", -1)
- str = strings.Replace(str, "javascript", "javascript", -1)
- return str
- }
- func MakeSimpleCaptcha(n int) string {
- var idChars = []byte("0123456789")
- b := captcha.RandomDigits(n)
- for i, c := range b {
- b[i] = idChars[c]
- }
- return string(b)
- }
- /**
- 获取当前时间的毫秒值
- */
- func Now4Millis() int64 {
- return time.Now().UnixNano() / 1e6
- }
- /*产生n以内的随机数*/
- func MakeIntRand(n int) int {
- rand.Seed(time.Now().UnixNano())
- return rand.Intn(n)
- }
- //生成32位md5字串
- func GetMd5String(s string) string {
- h := md5.New()
- h.Write([]byte(s))
- return hex.EncodeToString(h.Sum(nil))
- }
- func GenerateSimpleToken() string {
- rand.Seed(time.Now().UnixNano())
- str := fmt.Sprintf("%d%d", time.Now().UnixNano(), rand.Intn(999999))
- h := md5.New()
- h.Write([]byte(str))
- return hex.EncodeToString(h.Sum(nil))
- }
- //var pool = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@#$"
- //获取复杂的随机数
- func GetLetterRandom(length int, flag ...bool) string {
- var idChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
- var mod byte = 52
- if len(flag) > 0 && flag[0] {
- idChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
- mod = 26
- }
- b := make([]byte, length)
- maxrb := byte(256 - (256 % int(mod)))
- i := 0
- EXIT:
- for {
- r := make([]byte, length+(length/4))
- if _, err := io.ReadFull(cryptoRand.Reader, r); err != nil {
- panic("GetLetterRandom: error reading random source: " + err.Error())
- }
- for _, c := range r {
- if c > maxrb {
- continue
- }
- b[i] = c % mod
- i++
- if i == length {
- break EXIT
- }
- }
- }
- for i, c := range b {
- b[i] = idChars[c]
- }
- return string(b)
- }
- /*获取复杂的随机数,数字和字母的组合
- * c > 2 数字的个数和字母的个数随机分配
- * n 数字的个数
- * l 字母的个数
- */
- func GetComplexRandom(c, n, l int) string {
- if c < 2 && (n < 1 || l < 1) {
- return "--"
- }
- r := rand.New(rand.NewSource(time.Now().UnixNano()))
- myCommonMethod := func(flag bool) int {
- if flag {
- return r.Intn(c-1) + 1
- } else {
- return r.Intn(c)
- }
- }
- if c >= 2 {
- n = myCommonMethod(true)
- l = c - n
- } else {
- c = l + n
- }
- value := MakeSimpleCaptcha(n) + GetLetterRandom(l)
- var array = strings.Split(value, "")
- for i := 0; i < c/2; i++ {
- r1 := myCommonMethod(false)
- r2 := myCommonMethod(false)
- o := array[r1]
- array[r1] = array[r2]
- array[r2] = o
- }
- return strings.Join(array, "")
- }
|