IT评测·应用市场-qidao123.com技术社区

标题: 2024年大智慧教你学Java 没有绝对安全的体系,数据结构与算法面试题 [打印本页]

作者: 滴水恩情    时间: 2024-7-23 01:09
标题: 2024年大智慧教你学Java 没有绝对安全的体系,数据结构与算法面试题
给各人的福利

零底子入门
对于从来没有打仗过网络安全的同学,我们帮你预备了详细的学习成长路线图。可以说是最科学最体系的学习路线,各人跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

因篇幅有限,仅展示部分资料
网络安全面试题

绿盟护网举措

另有各人最喜欢的黑客技能

网络安全源码合集+工具包


全部资料共282G,朋侪们假如有必要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在批评区留言领取哦)~
网上学习资料一大堆,但假如学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技能提升。
必要这份体系化资料的朋侪,可以点击这里获取
一个人可以走的很快,但一群人才气走的更远!岂论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎加入我们的的圈子(技能交换、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
  1. /\*\* regex flag union representing /si modifiers in php \*\*/
  2. private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;
  3. private static final Pattern P_COMMENTS = Pattern.compile("<!--(.\*?)-->", Pattern.DOTALL);
  4. private static final Pattern P_COMMENT = Pattern.compile("^!--(.\*)--$", REGEX_FLAGS_SI);
  5. private static final Pattern P_TAGS = Pattern.compile("<(.\*?)>", Pattern.DOTALL);
  6. private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI);
  7. private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.\*?)(/?)$", REGEX_FLAGS_SI);
  8. private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=(["'])(.\*?)\\2", REGEX_FLAGS_SI);
  9. private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^"\\s']+)", REGEX_FLAGS_SI);
  10. private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI);
  11. private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?");
  12. private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?");
  13. private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?");
  14. private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]\*)(?=(;|&|$))");
  15. private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL);
  16. private static final Pattern P_END_ARROW = Pattern.compile("^>");
  17. private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]\*?)(?=<|$)");
  18. private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]\*?)(?=>)");
  19. private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]\*?)(?=<|$)");
  20. private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]\*?)(?=>)");
  21. private static final Pattern P_AMP = Pattern.compile("&");
  22. private static final Pattern P_QUOTE = Pattern.compile("<");
  23. private static final Pattern P_LEFT_ARROW = Pattern.compile("<");
  24. private static final Pattern P_RIGHT_ARROW = Pattern.compile(">");
  25. private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>");
  26. // @xxx could grow large... maybe use sesat's ReferenceMap
  27. private static final ConcurrentMap<String,Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<String, Pattern>();
  28. private static final ConcurrentMap<String,Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<String, Pattern>();
  29. /\*\* set of allowed html elements, along with allowed attributes for each element \*\*/
  30. private final Map<String, List<String>> vAllowed;
  31. /\*\* counts of open tags for each (allowable) html element \*\*/
  32. private final Map<String, Integer> vTagCounts = new HashMap<String, Integer>();
  33. /\*\* html elements which must always be self-closing (e.g. "<img />") \*\*/
  34. private final String[] vSelfClosingTags;
  35. /\*\* html elements which must always have separate opening and closing tags (e.g. "<b></b>") \*\*/
  36. private final String[] vNeedClosingTags;
  37. /\*\* set of disallowed html elements \*\*/
  38. private final String[] vDisallowed;
  39. /\*\* attributes which should be checked for valid protocols \*\*/
  40. private final String[] vProtocolAtts;
  41. /\*\* allowed protocols \*\*/
  42. private final String[] vAllowedProtocols;
  43. /\*\* tags which should be removed if they contain no content (e.g. "<b></b>" or "<b />") \*\*/
  44. private final String[] vRemoveBlanks;
  45. /\*\* entities allowed within html markup \*\*/
  46. private final String[] vAllowedEntities;
  47. /\*\* flag determining whether comments are allowed in input String. \*/
  48. private final boolean stripComment;
  49. private final boolean encodeQuotes;
  50. private boolean vDebug = false;
  51. /\*\*
复制代码
* flag determining whether to try to make tags when presented with “unbalanced”
* angle brackets (e.g. “<b text ” becomes “ text ”). If set to false,
* unbalanced angle brackets will be html escaped.
*/
private final boolean alwaysMakeTags;
  1. /\*\* Default constructor.
复制代码
*
*/
public HTMLFilter() {
vAllowed = new HashMap<>();
  1.     final ArrayList<String> a_atts = new ArrayList<String>();
  2.     a_atts.add("href");
  3.     a_atts.add("target");
  4.     vAllowed.put("a", a_atts);
  5.     final ArrayList<String> img_atts = new ArrayList<String>();
  6.     img_atts.add("src");
  7.     img_atts.add("width");
  8.     img_atts.add("height");
  9.     img_atts.add("alt");
  10.     vAllowed.put("img", img_atts);
  11.     final ArrayList<String> no_atts = new ArrayList<String>();
  12.     vAllowed.put("b", no_atts);
  13.     vAllowed.put("strong", no_atts);
  14.     vAllowed.put("i", no_atts);
  15.     vAllowed.put("em", no_atts);
  16.     vSelfClosingTags = new String[]{"img"};
  17.     vNeedClosingTags = new String[]{"a", "b", "strong", "i", "em"};
  18.     vDisallowed = new String[]{};
  19.     vAllowedProtocols = new String[]{"http", "mailto", "https"}; // no ftp.
  20.     vProtocolAtts = new String[]{"src", "href"};
  21.     vRemoveBlanks = new String[]{"a", "b", "strong", "i", "em"};
  22.     vAllowedEntities = new String[]{"amp", "gt", "lt", "quot"};
  23.     stripComment = true;
  24.     encodeQuotes = true;
  25.     alwaysMakeTags = true;
  26. }
  27. /\*\* Set debug flag to true. Otherwise use default settings. See the default constructor.
复制代码
*
* @param debug turn debug on with a true argument
*/
public HTMLFilter(final boolean debug) {
this();
vDebug = debug;
  1. }
  2. /\*\* Map-parameter configurable constructor.
复制代码
*
* @param conf map containing configuration. keys match field names.
*/
public HTMLFilter(final Map<String,Object> conf) {
  1.     assert conf.containsKey("vAllowed") : "configuration requires vAllowed";
  2.     assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags";
  3.     assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags";
  4.     assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed";
  5.     assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols";
  6.     assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts";
  7.     assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks";
  8.     assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities";
  9.     vAllowed = Collections.unmodifiableMap((HashMap<String, List<String>>) conf.get("vAllowed"));
  10.     vSelfClosingTags = (String[]) conf.get("vSelfClosingTags");
  11.     vNeedClosingTags = (String[]) conf.get("vNeedClosingTags");
  12.     vDisallowed = (String[]) conf.get("vDisallowed");
  13.     vAllowedProtocols = (String[]) conf.get("vAllowedProtocols");
  14.     vProtocolAtts = (String[]) conf.get("vProtocolAtts");
  15.     vRemoveBlanks = (String[]) conf.get("vRemoveBlanks");
  16.     vAllowedEntities = (String[]) conf.get("vAllowedEntities");
  17.     stripComment =  conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true;
  18.     encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true;
  19.     alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true;
  20. }
  21. private void reset() {
  22.     vTagCounts.clear();
  23. }
  24. private void debug(final String msg) {
  25.     if (vDebug) {
  26.         Logger.getAnonymousLogger().info(msg);
  27.     }
  28. }
  29. //---------------------------------------------------------------
  30. // my versions of some PHP library functions
  31. public static String chr(final int decimal) {
  32.     return String.valueOf((char) decimal);
  33. }
  34. public static String htmlSpecialChars(final String s) {
  35.     String result = s;
  36.     result = regexReplace(P_AMP, "&amp;", result);
  37.     result = regexReplace(P_QUOTE, "&quot;", result);
  38.     result = regexReplace(P_LEFT_ARROW, "&lt;", result);
  39.     result = regexReplace(P_RIGHT_ARROW, "&gt;", result);
  40.     return result;
  41. }
  42. //---------------------------------------------------------------
  43. /\*\*
复制代码
* given a user submitted input String, filter out any invalid or restricted
* html.
*
* @param input text (i.e. submitted by a user) than may contain html
* @return “clean” version of input, with only valid, whitelisted html elements allowed
*/
public String filter(final String input) {
reset();
String s = input;
  1.     debug("\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*");
  2.     debug(" INPUT: " + input);
  3.     s = escapeComments(s);
  4.     debug(" escapeComments: " + s);
  5.     s = balanceHTML(s);
  6.     debug(" balanceHTML: " + s);
  7.     s = checkTags(s);
  8.     debug(" checkTags: " + s);
  9.     s = processRemoveBlanks(s);
  10.     debug("processRemoveBlanks: " + s);
  11.     s = validateEntities(s);
  12.     debug(" validateEntites: " + s);
  13.     debug("\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\n\n");
  14.     return s;
  15. }
  16. public boolean isAlwaysMakeTags(){
  17.     return alwaysMakeTags;
  18. }
  19. public boolean isStripComments(){
  20.     return stripComment;
  21. }
  22. private String escapeComments(final String s) {
  23.     final Matcher m = P_COMMENTS.matcher(s);
  24.     final StringBuffer buf = new StringBuffer();
  25.     if (m.find()) {
  26.         final String match = m.group(1); //(.\*?)
  27.         m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->"));
  28.     }
  29.     m.appendTail(buf);
  30.     return buf.toString();
  31. }
  32. private String balanceHTML(String s) {
  33.     if (alwaysMakeTags) {
  34.         //
  35.         // try and form html
  36.         //
  37.         s = regexReplace(P_END_ARROW, "", s);
  38.         s = regexReplace(P_BODY_TO_END, "<$1>", s);
  39.         s = regexReplace(P_XML_CONTENT, "$1<$2", s);
  40.     } else {
  41.         //
  42.         // escape stray brackets
  43.         //
  44.         s = regexReplace(P_STRAY_LEFT_ARROW, "&lt;$1", s);
  45.         s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2&gt;<", s);
  46.         //
  47.         // the last regexp causes '<>' entities to appear
  48.         // (we need to do a lookahead assertion so that the last bracket can
  49.         // be used in the next pass of the regexp)
  50.         //
  51.         s = regexReplace(P_BOTH_ARROWS, "", s);
  52.     }
  53.     return s;
  54. }
  55. private String checkTags(String s) {
  56.     Matcher m = P_TAGS.matcher(s);
  57.     final StringBuffer buf = new StringBuffer();
  58.     while (m.find()) {
  59.         String replaceStr = m.group(1);
  60.         replaceStr = processTag(replaceStr);
  61.         m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));
  62.     }
  63.     m.appendTail(buf);
  64.     s = buf.toString();
  65.     // these get tallied in processTag
  66.     // (remember to reset before subsequent calls to filter method)
  67.     for (String key : vTagCounts.keySet()) {
  68.         for (int ii = 0; ii < vTagCounts.get(key); ii++) {
  69.             s += "</" + key + ">";
  70.         }
  71.     }
  72.     return s;
  73. }
  74. private String processRemoveBlanks(final String s) {
  75.     String result = s;
  76.     for (String tag : vRemoveBlanks) {
  77.         if(!P_REMOVE_PAIR_BLANKS.containsKey(tag)){
  78.             P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]\*)?></" + tag + ">"));
  79.         }
  80.         result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);
  81.         if(!P_REMOVE_SELF_BLANKS.containsKey(tag)){
  82.             P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]\*)?/>"));
  83.         }
  84.         result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);
  85.     }
  86.     return result;
  87. }
  88. private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) {
  89.     Matcher m = regex_pattern.matcher(s);
  90.     return m.replaceAll(replacement);
  91. }
  92. private String processTag(final String s) {
  93.     // ending tags
  94.     Matcher m = P_END_TAG.matcher(s);
  95.     if (m.find()) {
  96.         final String name = m.group(1).toLowerCase();
  97.         if (allowed(name)) {
  98.             if (!inArray(name, vSelfClosingTags)) {
  99.                 if (vTagCounts.containsKey(name)) {
  100.                     vTagCounts.put(name, vTagCounts.get(name) - 1);
  101.                     return "</" + name + ">";
  102.                 }
  103.             }
  104.         }
  105.     }
  106.     // starting tags
  107.     m = P_START_TAG.matcher(s);
  108.     if (m.find()) {
  109.         final String name = m.group(1).toLowerCase();
  110.         final String body = m.group(2);
  111.         String ending = m.group(3);
  112.         if (allowed(name)) {
  113.             String params = "";
  114.             final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);
  115.             final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);
  116.             final List<String> paramNames = new ArrayList<String>();
  117.             final List<String> paramValues = new ArrayList<String>();
  118.             while (m2.find()) {
  119.                 paramNames.add(m2.group(1)); //([a-z0-9]+)
  120.                 paramValues.add(m2.group(3)); //(.\*?)
  121.             }
  122.             while (m3.find()) {
  123.                 paramNames.add(m3.group(1)); //([a-z0-9]+)
  124.                 paramValues.add(m3.group(3)); //([^"\\s']+)
  125.             }
  126.             String paramName, paramValue;
  127.             for (int ii = 0; ii < paramNames.size(); ii++) {
  128.                 paramName = paramNames.get(ii).toLowerCase();
  129.                 paramValue = paramValues.get(ii);
  130.                 if (allowedAttribute(name, paramName)) {
  131.                     if (inArray(paramName, vProtocolAtts)) {
  132.                         paramValue = processParamProtocol(paramValue);
  133.                     }
  134.                     params += " " + paramName + "="" + paramValue + """;
  135.                 }
  136.             }
  137.             if (inArray(name, vSelfClosingTags)) {
  138.                 ending = " /";
  139.             }
  140.             if (inArray(name, vNeedClosingTags)) {
  141.                 ending = "";
  142.             }
  143.             if (ending == null || ending.length() < 1) {
  144.                 if (vTagCounts.containsKey(name)) {
  145.                     vTagCounts.put(name, vTagCounts.get(name) + 1);
  146.                 } else {
  147.                     vTagCounts.put(name, 1);
  148.                 }
  149.             } else {
  150.                 ending = " /";
  151.             }
  152.             return "<" + name + params + ending + ">";
  153.         } else {
  154.             return "";
  155.         }
  156.     }
  157.     // comments
  158.     m = P_COMMENT.matcher(s);
  159.     if (!stripComment && m.find()) {
  160.         return  "<" + m.group() + ">";
  161.     }
  162.     return "";
  163. }
  164. private String processParamProtocol(String s) {
  165.     s = decodeEntities(s);
  166.     final Matcher m = P_PROTOCOL.matcher(s);
  167.     if (m.find()) {
  168.         final String protocol = m.group(1);
  169.         if (!inArray(protocol, vAllowedProtocols)) {
  170.             // bad protocol, turn into local anchor link instead
  171.             s = "#" + s.substring(protocol.length() + 1, s.length());
  172.             if (s.startsWith("#//")) {
  173.                 s = "#" + s.substring(3, s.length());
  174.             }
  175.         }
  176.     }
  177.     return s;
  178. }
  179. private String decodeEntities(String s) {
  180.     StringBuffer buf = new StringBuffer();
  181.     Matcher m = P_ENTITY.matcher(s);
  182.     while (m.find()) {
  183.         final String match = m.group(1);
  184.         final int decimal = Integer.decode(match).intValue();
  185.         m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
  186.     }
  187.     m.appendTail(buf);
  188.     s = buf.toString();
  189.     buf = new StringBuffer();
  190.     m = P_ENTITY_UNICODE.matcher(s);
  191.     while (m.find()) {
  192.         final String match = m.group(1);
  193.         final int decimal = Integer.valueOf(match, 16).intValue();
  194.         m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
  195.     }
  196.     m.appendTail(buf);
  197.     s = buf.toString();
  198.     buf = new StringBuffer();
  199.     m = P_ENCODE.matcher(s);
  200.     while (m.find()) {
  201.         final String match = m.group(1);
  202.         final int decimal = Integer.valueOf(match, 16).intValue();
  203.         m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
  204.     }
  205.     m.appendTail(buf);
  206.     s = buf.toString();
  207.     s = validateEntities(s);
  208.     return s;
  209. }
  210. private String validateEntities(final String s) {
  211.     StringBuffer buf = new StringBuffer();
  212.     // validate entities throughout the string
  213.     Matcher m = P_VALID_ENTITIES.matcher(s);
  214.     while (m.find()) {
  215.         final String one = m.group(1); //([^&;]\*)
  216.         final String two = m.group(2); //(?=(;|&|$))
  217.         m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));
  218.     }
  219.     m.appendTail(buf);
  220.     return encodeQuotes(buf.toString());
  221. }
  222. private String encodeQuotes(final String s){
  223.     if(encodeQuotes){
  224.         StringBuffer buf = new StringBuffer();
  225.         Matcher m = P_VALID_QUOTES.matcher(s);
  226.         while (m.find()) {
  227.             final String one = m.group(1); //(>|^)
  228.             final String two = m.group(2); //([^<]+?)
  229.             final String three = m.group(3); //(<|$)
  230.             m.appendReplacement(buf, Matcher.quoteReplacement(one + regexReplace(P_QUOTE, "&quot;", two) + three));
  231.         }
  232.         m.appendTail(buf);
  233.         return buf.toString();
  234.     }else{
  235.         return s;
  236.     }
  237. }
  238. private String checkEntity(final String preamble, final String term) {
  239.     return ";".equals(term) && isValidEntity(preamble)
  240.             ? '&' + preamble
  241.             : "&amp;" + preamble;
  242. }
  243. private boolean isValidEntity(final String entity) {
  244.     return inArray(entity, vAllowedEntities);
  245. }
  246. private static boolean inArray(final String s, final String[] array) {
  247.     for (String item : array) {
  248.         if (item != null && item.equals(s)) {
  249.             return true;
  250.         }
  251.     }
  252.     return false;
  253. }
  254. private boolean allowed(final String name) {
  255.     return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);
  256. }
  257. private boolean allowedAttribute(final String name, final String paramName) {
  258.     return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));
  259. }
复制代码
}
  1. [/code] import javax.servlet.*;
  2. import javax.servlet.http.HttpServletRequest;
  3. import java.io.IOException;
  4. /**
  5. * XSS过滤
  6. *
  7. */
  8. public class XssFilter implements Filter {
  9. [code]@Override
  10. public void init(FilterConfig config) throws ServletException {
  11. }
  12. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  13.         throws IOException, ServletException {
  14.         XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
  15.         chain.doFilter(xssRequest, response);
  16. }
  17. @Override
  18. public void destroy() {
  19. }
复制代码
}
[code][/code] import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.MediaType;
/**
* XSS过滤处置惩罚
给各人的福利

零底子入门
对于从来没有打仗过网络安全的同学,我们帮你预备了详细的学习成长路线图。可以说是最科学最体系的学习路线,各人跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

因篇幅有限,仅展示部分资料
网上学习资料一大堆,但假如学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技能提升。
必要这份体系化资料的朋侪,可以点击这里获取
一个人可以走的很快,但一群人才气走的更远!岂论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎加入我们的的圈子(技能交换、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4