stringutil.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package utils
  2. import (
  3. "crypto/md5"
  4. cryptoRand "crypto/rand"
  5. "encoding/hex"
  6. "fmt"
  7. "github.com/dchest/captcha"
  8. "io"
  9. "math/rand"
  10. "strings"
  11. "time"
  12. )
  13. func FilterXSS(str string) string {
  14. str = strings.Replace(str, "<", "&#60;", -1)
  15. str = strings.Replace(str, ">", "&#62;", -1)
  16. str = strings.Replace(str, "%3C", "&#60;", -1)
  17. str = strings.Replace(str, "%3E", "&#62;", -1)
  18. str = strings.Replace(str, "expression", "expression", -1)
  19. str = strings.Replace(str, "javascript", "javascript", -1)
  20. return str
  21. }
  22. func MakeSimpleCaptcha(n int) string {
  23. var idChars = []byte("0123456789")
  24. b := captcha.RandomDigits(n)
  25. for i, c := range b {
  26. b[i] = idChars[c]
  27. }
  28. return string(b)
  29. }
  30. /**
  31. 获取当前时间的毫秒值
  32. */
  33. func Now4Millis() int64 {
  34. return time.Now().UnixNano() / 1e6
  35. }
  36. /*产生n以内的随机数*/
  37. func MakeIntRand(n int) int {
  38. rand.Seed(time.Now().UnixNano())
  39. return rand.Intn(n)
  40. }
  41. //生成32位md5字串
  42. func GetMd5String(s string) string {
  43. h := md5.New()
  44. h.Write([]byte(s))
  45. return hex.EncodeToString(h.Sum(nil))
  46. }
  47. func GenerateSimpleToken() string {
  48. rand.Seed(time.Now().UnixNano())
  49. str := fmt.Sprintf("%d%d", time.Now().UnixNano(), rand.Intn(999999))
  50. h := md5.New()
  51. h.Write([]byte(str))
  52. return hex.EncodeToString(h.Sum(nil))
  53. }
  54. //var pool = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@#$"
  55. //获取复杂的随机数
  56. func GetLetterRandom(length int, flag ...bool) string {
  57. var idChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
  58. var mod byte = 52
  59. if len(flag) > 0 && flag[0] {
  60. idChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
  61. mod = 26
  62. }
  63. b := make([]byte, length)
  64. maxrb := byte(256 - (256 % int(mod)))
  65. i := 0
  66. EXIT:
  67. for {
  68. r := make([]byte, length+(length/4))
  69. if _, err := io.ReadFull(cryptoRand.Reader, r); err != nil {
  70. panic("GetLetterRandom: error reading random source: " + err.Error())
  71. }
  72. for _, c := range r {
  73. if c > maxrb {
  74. continue
  75. }
  76. b[i] = c % mod
  77. i++
  78. if i == length {
  79. break EXIT
  80. }
  81. }
  82. }
  83. for i, c := range b {
  84. b[i] = idChars[c]
  85. }
  86. return string(b)
  87. }
  88. /*获取复杂的随机数,数字和字母的组合
  89. * c > 2 数字的个数和字母的个数随机分配
  90. * n 数字的个数
  91. * l 字母的个数
  92. */
  93. func GetComplexRandom(c, n, l int) string {
  94. if c < 2 && (n < 1 || l < 1) {
  95. return "--"
  96. }
  97. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  98. myCommonMethod := func(flag bool) int {
  99. if flag {
  100. return r.Intn(c-1) + 1
  101. } else {
  102. return r.Intn(c)
  103. }
  104. }
  105. if c >= 2 {
  106. n = myCommonMethod(true)
  107. l = c - n
  108. } else {
  109. c = l + n
  110. }
  111. value := MakeSimpleCaptcha(n) + GetLetterRandom(l)
  112. var array = strings.Split(value, "")
  113. for i := 0; i < c/2; i++ {
  114. r1 := myCommonMethod(false)
  115. r2 := myCommonMethod(false)
  116. o := array[r1]
  117. array[r1] = array[r2]
  118. array[r2] = o
  119. }
  120. return strings.Join(array, "")
  121. }