1. PHP / Говнокод #7815

    +154

    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
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    <?php
    function import_var($name,$source,$type,$maxlen=0) {
    	$retarr=array();
    	if(is_array($name)) { // если нужно обработать массив с именами
    		foreach($name as $v) {
    			$retarr[$v] = import_var($v,$source,$type,$maxlen);
    			// рекурсивно запускаем себя же
    		}
    	if(sizeof($retarr)>0) return $retarr; // возвращаем массив
    	}
    	// если нужно обработать одну переменную
    	switch($source) {
    		case 'G':
    			if (isset($_GET[$name])) {
    				$var=$_GET[$name];  // из GET
    			}
    		break;
    		case 'P':
    			if (isset($_POST[$name])) {
    				$var=$_POST[$name];  // из POST
    			}
    		break;
    		case 'C':
    			if (isset($_COOKIE[$name])) {
    				$var=$_COOKIE[$name];  // из Cookie
    			}
    		break;
    	}
    
    	if(!isset($var)) return false; // если переменная существует
    
    	if(is_array($var)) return false; // и если это не массив...
    
    	if(get_magic_quotes_gpc()) $var = stripslashes($var);
    	// убираем лишние бэкслэши
    
    	if(empty($var)) return false; // если переменная пуста
    
    	if ($maxlen>0) $var = substr($var,0,$maxlen); //обрубаем лишнее
    
    	switch($type) { // теперь обрабатываем в соответствии с типом
    		case 'INT' : // число integer
    			return is_integer($var) ? $var : intval($var);
    		break;
    		case 'NUM' : // число integer или float
    			return is_numeric($var) ? $var : false;
    		break;
    		case 'HTML' : // текст, в котором могут содержаться тэги
    			return trim(htmlspecialchars($var));
    		break;
    		case 'SQL' : // строка, которая попадет в SQL-запрос
    			return mysql_real_escape_string(htmlspecialchars($var));
    		break;
    		case 'MAIL'	: // email-адрес
    			return preg_match('/^[\w\.\-]+@\w+[\w\.\-]*?\.\w{2,4}$/',$var) ? $var : false;
    		break;
    		case 'ALPHA' : // только буквенные символы
    			return preg_match("/^[а-яА-ЯёЁa-zA-Z]+$/",$var) ? $var : false;
    		break;
    		case 'ALPHANUM' : // числовые и буквенные символы
    			return preg_match("/^[а-яА-ЯёЁa-zA-Z0-9]+$/",$var) ? $var : false;
    		break;
    		case 'MD5' : // md5-хэш
    			return preg_match("/^[a-fA-F0-9]{32}+$/",$var) ? $var : false;
    		break;
    		case 'SHA1' : // sha1-хэш
    			return preg_match("/^[a-fA-F0-9]{40}+$/",$var) ? $var : false;
    		break;
    		case 'BOOL': // булева величина
    			return ($var=="1" || $var=="true" || $var=="on") ? true : false;
    		break;
    	}
    }
    ?>

    http://raz0r.name/releases/funkciya-dlya-obrabotki-vxodyashhix-dannyx/

    Запостил: sectus, 09 Сентября 2011

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

    • и чо блять
      Ответить
    • Изо всех сил пытался найти в чем фейл. Ну разве что тут
      preg_match("/^[a-fA-F0-9]{32}+$/",$var)
      + лишний.
      А так-то вроде норм. Лишнего в функцию не подпихнешь, программист учел то, что magic_quotes могут быть включены и даже, что $name может быть массивом. Где откровенное говно-то?...

      Может быть имелось ввиду излишнее кол-во очевидных комментариев типа
      case 'INT' : // число integer
      ?
      Ответить
      • ммм... да, плюсик мне тоже мозолил глаз, но я не акцентировал на этом внимание.
        Ответить
    • Я вижу только говно в том, что эта функция может возвращать результат кучи различных типов, что не есть удобно.
      Ответить
    • Я влюбился... чел КОММЕНТИРУЕТ КОД!!!
      Он божественнен. песпес.ы
      Ответить
    • Обработка по типу - офигенна.
      Ответить
    • спасибо за код, утащил, пока не утопили )))
      Ответить
    • Что мне не понравилось:
      * if ($maxlen>0) $var = substr($var,0,$maxlen); - нет работы с mb строками. Тихое обрезание строки. Это не очень страшно, но, если кто-то напишет Войну и Мир на твоём сайте, а сохранится только предисловие - будет обидно.
      * Ненужная проверка в 9 строке. Если передать в $name пустой массив, то получим ошибку, вместо пустого массива на выходе.
      * Нельзя различить два случая: передали переменную равную 0('') и не передали переменную вообще.
      * Разное поведение типов INT и NUM.
      * return is_integer($var) ? $var : intval($var); - бессмысленная проверка, ведь $var при входе в условие будет всегда строкой (если, конечно, не записать в эти массивы что-нибудь самому).
      * Нет обработки _SERVER (ну и _REQUEST, но им можно и не пользоваться).
      * Нельзя получить массив.
      * И интересный тип HTML... ведь этот подход в целом, по замыслу автора, позволяет избежать sql инъекций, а этот тип как раз пропустит их.
      Ответить
      • а, ещё...
        * чтобы пользоваться этой функцией нужно иметь подключение через mysql_connect
        Ответить
    • "добавлено 16 Май 2008, 16:24", - чел может ещё только учился...
      А, вот, спрашивается, sectus, какого х.я ты там забыл??!
      Ответить
      • Ссылка на этот пост была на хабре в ответе на вопрос: как избежать xss и sql-инъекций.

        И автор комментировал этот пост последний раз "3. Январь 2010, 13:48", т.е. почти два года он поддерживал код.
        Ответить
    • Какой же он всё-таки сладкий! Так не хочется отрываться от него. Но, стоп! Надо не забывать, где мы. Работу я всё же потерять не хочу.
      Ответить

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