"PHP" / Говнокод #7815 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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\.\-]<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="def59e">[email protected]</a>\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 sectus, (Updated )

Комментарии (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", т.е. почти два года он поддерживал код.
      Ответить
  • Какой же он всё-таки сладкий! Так не хочется отрываться от него. Но, стоп! Надо не забывать, где мы. Работу я всё же потерять не хочу.
    Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8