DefenseInjectionHelper.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System.Text;
  2. namespace Vinno.vCloud.Disk
  3. {
  4. public static class DefenseInjectionHelper
  5. {
  6. /**
  7. * 将容易引起xss漏洞的半角字符直接替换成全角字符
  8. *
  9. * @param s
  10. * @return
  11. */
  12. public static string XssEncode(this string s)
  13. {
  14. if (string.IsNullOrWhiteSpace(s))
  15. {
  16. return string.Empty;
  17. }
  18. StringBuilder sb = new StringBuilder();
  19. for (int i = 0; i < s.Length; i++)
  20. {
  21. char c = s[i];
  22. switch (c)
  23. {
  24. case '>':
  25. sb.Append('>');// 全角大于号
  26. break;
  27. case '<':
  28. sb.Append('<');// 全角小于号
  29. break;
  30. case '\'':
  31. sb.Append('‘');// 全角单引号
  32. break;
  33. case '\"':
  34. sb.Append('“');// 全角双引号
  35. break;
  36. case '&':
  37. sb.Append('&');// 全角
  38. break;
  39. case '\\':
  40. sb.Append('\');// 全角斜线
  41. break;
  42. case '#':
  43. sb.Append('#');// 全角井号
  44. break;
  45. case '%': // < 字符的 URL 编码形式表示的 ASCII 字符(十六进制格式) 是: %3c
  46. ProcessUrlEncoder(sb, s, i);
  47. break;
  48. default:
  49. sb.Append(c);
  50. break;
  51. }
  52. }
  53. return sb.ToString().Trim();
  54. }
  55. private static void ProcessUrlEncoder(StringBuilder sb, string s, int index)
  56. {
  57. if (s.Length >= index + 2)
  58. {
  59. if (s[index + 1] == '3' && (s[index + 2] == 'c' || s[index + 2] == 'C'))
  60. { // %3c, %3C
  61. sb.Append('<');
  62. return;
  63. }
  64. if (s[index + 1] == '6' && s[index + 2] == '0')
  65. { // %3c (0x3c=60)
  66. sb.Append('<');
  67. return;
  68. }
  69. if (s[index + 1] == '3' && (s[index + 2] == 'e' || s[index + 2] == 'E'))
  70. { // %3e, %3E
  71. sb.Append('>');
  72. return;
  73. }
  74. if (s[index + 1] == '6' && s[index + 2] == '2')
  75. { // %3e (0x3e=62)
  76. sb.Append('>');
  77. return;
  78. }
  79. }
  80. sb.Append(s[index]);
  81. }
  82. }
  83. }