1. Java / Говнокод #2658

    +77.1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    public static boolean isValidUser(String user)
    	{
    		if(user == null) return true;
    		int len = user.length();
    		if (len > 255) return false;
    		char c;
    		for(int i=0; i<len; i++)
    		{
    			c = user.charAt(i);
    			if (c <= ' ') return false;
    			if (c == ':') return false;
    			if (c == '@') return false;
    			if (c == '"') return false;
    			if (c == '>') return false;
    			if (c == '<') return false;
    			if (c == '/') return false;
    			if (c == '\'') return false;
    			if (c == '&') return false;
    			if (c == '\u077F') return false;
    			if (c == '\u0FFE') return false;
    			if (c == '\u0FFF') return false;
    		}
    		return true;
    	}

    проверка имени пользователя на плохие символые в Jeti

    Запостил: danilissimus, 24 Февраля 2010

    Комментарии (13) RSS

    • Не знаю, как в Java, но во многих других языках проверить строку таким образом быстрее, чем регекспом. Можно, конечно, все условия через || записать, но ни с точки зрения читабельности, ни производительности, я думаю, что рзницы не будет, т.как по смыслу одно и то же... Или в Java нельзя невалидные юникоды в строку запихать?
      Ответить
      • >быстрее
        ага, пройтись циклом по всем символам быстрее, чем просто использовать indexOf.
        вот, что быстрее:
        String[] bad = {" ", ":", "@", "\"", ">", "<", "/", "\\", "&", "\u077F", "\u0FFE", "\u0FFF"};
                for(String pt : bad) {
                    if(user.indexOf(pt) != -1) return false;
                }
        Ответить
        • Как будто indexOf() не делает то же самое :) - этот тот же цикл, просто завернутый в функцию.
          Ответить
        • Ха. IndexOf - цикл, вложенный в цикл for(String pt : bad).
          Ответить
          • плюс ) а вообще можно увеличить читабельность так:

            for(int i=0; i<len; i++)
            {
            c = user.charAt(i);
            if (" :@"<>/\'&\u077F\u0FFE\u0FFF".indexOf(c) != -1)
            return false;
            }
            Ответить
    • Меня всегда умиляло понятие 'плохой символ' и подобные switch/if/indexOf'ы при работе с unicode'ом. Почему я не могу использовать пробел, но могу напихать NO-BREAK SPACE'ов? Почему я не могу использовать &, но могу сделать ZALGO, или еще какую пакость?
      Тут уж либо работа по категориям символов (в крайнем случае старое доброе [a-z]), либо вообще в жопу такие ограничения.
      И вообще набор символов напоминает говно-анти-XSS-SQLInjection
      Ответить
      • >Почему я не могу использовать пробел, но могу напихать NO-BREAK SPACE'ов?
        из-за особенностей протокола.
        например в IRC делимитером в пакетах служит пробел. поэтому его нельзя использовать в никах и.т.д. а другие символы можно. Jeti - jabber клиент.
        Ответить
        • Почитал XEP и понял, что я нервный дурак. Спасибо.
          Ответить
    • int len = user.length();
      if (len > 255) return false;

      "Извините, в вас много букв" ))
      Ответить
    • а strpbrk() на что?

      альзо, bool-shit detected
      Ответить
      • на то, что в java strpbrk нету!
        Ответить
        • так ведь можно реализовать, это не очень сложно
          и код будет более читаемый
          Ответить

    Добавить комментарий