Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для Wegik
0 / 0 / 1
Регистрация: 23.08.2014
Сообщений: 63

Проверка кода

25.08.2014, 19:26. Показов 1191. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, можете пожалуйста проверить на говнокод? буду очень благодарен. Создаётся страница в которой будет содержаться данные полученные с предыдущей странице, а именно путь, название и само содержание страницы
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 <?php
if (empty ($_POST ["_name"])){$_POST ["_name"]="";}
if (empty ($_POST ["_kontent"])){$_POST ["_kontent"]="";}
if (empty ($_POST ["_file_name"])){$_POST ["_file_name"]="";}
$name=$_POST ["_name"];
$kontent=$_POST ["_kontent"];
$f=$_POST ["_file_name"];
$put="";
if ($_POST ["_kat"]=="Существа"){$put="..";}
if ($_POST ["_kat"]=="Города и поселения"){$put="../..";}
if ($_POST ["_kat"]=="Пространства и измерения"){$put="../..";}
if ($_POST ["_kat"]=="Обзоры и отзывы"){$put="../..";}
if ($_POST ["_kat"]=="Авторы"){$put="../..";}
 
if ($_POST ["_kat"]=="Существа"){$_POST ["_kat"]="../../race/";}
if ($_POST ["_kat"]=="Города и поселения"){$_POST ["_kat"]="../../world/place/";}
if ($_POST ["_kat"]=="Пространства и измерения"){$_POST ["_kat"]="../../world/space/";}
if ($_POST ["_kat"]=="Обзоры и отзывы"){$_POST ["_kat"]="../../books/review/";}
if ($_POST ["_kat"]=="Авторы"){$_POST ["_kat"]="../../books/authors/";}
$s=$_POST ["_kat"];
$names="Создание страницы";
$kontents="Имя:$name</br>Контент:$kontent</br>Имя файла:$f</br>Категория:$s</br>$s$f</br><a href='$s$f'>Открыть страницу</a>";
$osnova="<?php \$name=\"$name\"; \$kontent=\"$kontent\"; include('$put/shablon/osnova.php'); ?>";
$fp=fopen("$s$f",'w');
fputs($fp,"$osnova");
$file=fclose($fp);
?>
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.08.2014, 19:26
Ответы с готовыми решениями:

Проверка кода
Вообщем нужно мне создать excel документ при помощи php =) Скачал библиотеку PHPExcel, начал с ней работать выдаёт ошибку=) Думал сначала...

Проверка кода товара на валидность
мне нужно из ссылки выбирать код товара, вот пример ссылки ...

Проверка кода в форме с выводом данных
Доброго времени суток. Пытаюсь освоить php. Ну и собственно рисую сам себе задачи. Пытаюсь собрать в одном файле следующую...

3
SV
55 / 55 / 25
Регистрация: 03.08.2014
Сообщений: 258
25.08.2014, 19:55
PHP
1
2
3
4
5
6
// вместо
if (empty ($_POST ["_name"])){$_POST ["_name"]="";}
// логичнее и проще конструкция вида
// $name = ''; // дефолтовое значение
if(isset($_POST['_name']))
 $name = $_POST['_name'];
PHP
1
2
// или даже запихать в одну строку
$name = isset($_POST['_name']) ? $_POST['name'] : '';
если у вас после if идёт один оператор - скобки можно опустить.
PHP
1
2
if(true)
  $a = $b;
Вместо лапши из ифов лучше использовать свитч
PS кстати вы не проверили что _POST[_kat] существует
PHP
1
2
3
4
5
6
7
8
9
10
11
switch( $_POST[_kat] ) {
  case 'Существа':
     //bla bla bla
  break;
  case 'Города':
    //bla bla bla
  break;
  default:
   // чёт другое, не перечисленное 
  break;
}
Вообще подход некрасивый.
Я бы сделал так - создал бы массив, в котором клю - это категория, а значение - это путь.

PHP
1
2
3
4
5
6
7
8
$path = [
'Города' => 'Цэ, двоеточие, и т.д.',
'Поезда' => 'Путь к поездам'
];
 
$put = '';
if( isset($path[ $_POST['kat'] ]) )
  $put = $path[ $_POST['kat'] ];
Следующий важный момент - вы создаёте пхп страницу с данным полученным от пользователя.
Нафиг это надо - не понятно, но допустим действительно надо.
Вы создаете эту страницу не проверяя какие данные туда насовал юзер.
А если я вам в поле name засуну код который запусти форматирование диска? или даст мне права админа записав кое что и кое куда? ай ай ай

давайте или везде используйте английские названия, а не $put, или используйте русские везде. Хотя это конечно тоже ужасно. Учите английски, программист без английского - калека.
0
 Аватар для metacoder
35 / 35 / 15
Регистрация: 28.07.2011
Сообщений: 64
25.08.2014, 23:19
1. Для ввода данных можно сделать специальный класс и постепенно его развивать (подглядывая в существующие реализации), и использовать везде в своём движке. Типа:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
class Request {
  public static function post($name, $alter = NULL) {
    return isset($_POST[$name]) ? $_POST[$name] : $alter;
  }
  
  public static function get($name, $alter = NULL) {
    return isset($_GET[$name]) ? $_GET[$name] : $alter;
  }
}
 
$name = Request::post('_name', '');
$content = Request::post('_content', '');
$f = Request::post('_file_name');
2. Присваивать обратно в $_POST не очень хорошо.

3. Как сказал SV любые входные данные нужно проверять. Делать это нужно как в целях безопасности, так и в целях проверки соответствия входных данных ожидаемому типу (целое, строка, адрес почты...). Последнее называется валидация. Если у меня сейчас получится написать небольшой пример как её реализовывать, тогда запощу

4. Разные программисты используют разные стили оформления кода. Но, в одну строчку if с фигурными скобками писать не особо принято. Это ухудшает читабельность. Сам я обычно делаю так:

PHP
1
2
3
4
5
6
7
// Когда реально короткое что-то
if (empty($_POST ["_name"])) $_POST ["_name"]="";
 
// Если что-то большее
if ( empty($_POST ["_name"]) ) {
  $_POST ["_name"]="";
}
0
 Аватар для metacoder
35 / 35 / 15
Регистрация: 28.07.2011
Сообщений: 64
26.08.2014, 08:50
По повоуд валидации и фильтрации. В PHP есть специальные функции, которые делают это, посмотреть на них можно тут: http://php.net/manual/ru/book.filter.php С их помощью можно достигать безопасности входных данных.

Другой вариант - писать собственные валидаторы. Сделать это можно так, что потом будет гораздо проще ими пользоваться. Я приведу пример, который накодил сейчас с утра, идею которого можно взять на вооружение и развить.

Синтаксис правил валидации похож на многие реализации, хотя, специально никуда не смотрел, по тому могут быть и косяки какие-то... Тоже буду рад выслушать любую конструктивную критику.

Что хотелось изначально. Написать кучку валидаторов и класс, который проверял бы входные данные ($_REQUEST, $_POST, $_GET, или какой-то другой массив) на соответствие этим правилам, а параллельно ещё и фильтровал что нужно. И что бы каждый раз не вызывать кучу функций проверки и иметь возможность удобно собирать список ошибок валидации. Что-то типа:

PHP
1
2
3
4
5
6
7
8
$validator = Validator([
  'user_name' => 'required|match:[A-Za-z0-9]*|min:3|max:12',
  'email' => 'required|email',
], $_POST);
 
if ($validator->failed()) {
  var_dump($validator->errors); // Тестовый вывод ошибок :)
}
Сообщения об ошибках что бы так вот что бы указать можно было:

PHP
1
2
3
4
5
6
7
8
9
10
$validator = Validator::make([
  'user_name' => [
    'required|min:3|max:12' => 'Имя пользователя должно быть длиннее 3х и короче 12-ти символов',
    'match:[A-Za-z0-9]*' => 'Имя пользователя должно содержать только буквы и цифры',
  ],
  'email' => [
    'required' => 'Укажите почту',
    'email' => 'Почта некорректна',
  ],
]);
А ещё хотелось бы, что бы можно было указывать откуда брать основную массу данных и специально отмечать переменные из других источников:

PHP
1
2
3
4
5
6
7
8
9
10
11
$validator = Validator::make([
  'user_name' => [
    'required|min:3|max:12' => 'Имя пользователя должно быть длиннее 3х и короче 12-ти символов',
    'match:[A-Za-z0-9]*' => 'Имя пользователя должно содержать только буквы и цифры',
  ],
  'email' => [
    'required' => 'Укажите почту',
    'email' => 'Почта некорректна',
  ],
  'GET:operation' => 'match:[A-Za-z]',
], $_POST);
Ну и для полного счастья, естественно, каждая функция валидатор должна иметь возможность принимать любое количество аргументов любого вида, а так же изменять их, если нужно!

Собственно код валидатора:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
class Validator {
  protected static $validators = []; // ruleName => validator
  protected $rules = [];             // varName => rule
  protected $messages = [];          // varName => rule => message
 
  public $defaultVarSource = NULL;   // Нужно подумать как и закрыть эту переменную :)
  public $errors = [];
 
  /* Создаёт экземляр валидатора по массиву правил
   */
  public static function make($rules, &$defaultVarSource = NULL)
  {
    $validator = new Validator;
    
    foreach ($rules as $varName => $varRules) {
      if (is_array($varRules)) {
    foreach ($varRules as $rI => $rV) {
      if (is_int($rI)) {
        $rule = $rV;
        $message = NULL;
      } else {
        $rule = $rI;
        $message = $rV;
      }
      $validator->addVarRules($varName, $rule, $message);
    }
      } else if (is_string($varRules)) {
    $validator->addVarRules($varName, $varRules);
      }
    }
 
    if ($defaultVarSource === NULL) {
      $validator->defaultVarSource = &$_REQUEST;
    } else {
      $validator->defaultVarSource = &$defaultVarSource;
    }
 
    return $validator;
  }
 
  /* Добавляет новую функцию-валидатор
   */
  public static function addValidator($ruleName, $validatorName)
  {
    self::$validators[$ruleName] = $validatorName;
  }
 
  /* Проверяет входные данные на соответствие правилам валидации
   */
  public function failed()
  {
    $this->errors = [];
    
    foreach ($this->rules as $varName=>$rules) {
      foreach ($rules as $rule) {
    if (!$this->validate($varName, $rule))
      $this->errors[] = $this->getFailMessage($varName, $rule);
      }
    }
 
    $this->errors = array_unique($this->errors);
    
    return !empty($this->errors);
  }
  
  // --- ТУТ ИНТЕРФЕЙС ЗАКАНЧИВАЕТСЯ И НАЧИНАЕТСЯ РЕАЛИЗАЦИЯ ---
 
  /* Парсит строку с правилами (если их несколько) и запоминает
   * к какой переменной нужно применить указанные правила
   */
  public function addVarRules($varName, $varRules, $failMessage = NULL)
  {
    $rules = explode('|', $varRules);
    
    foreach ($rules as $rule) {
      if (empty($rule)) continue;
      $this->rules[$varName][] = $rule;
      if (!empty($failMessage)) {
    $this->messages[$varName][$rule] = $failMessage;
      }
    }
  }
 
  /* Возврвщает сообщение об ошибке, соответствующее нарушению конкретного правила
   * для конкретной переменной
   */
  protected function getFailMessage($varName, $rule)
  {
    if (isset($this->messages[$varName][$rule])) {
      return $this->messages[$varName][$rule];
    } else {
      // Пользователь этого в интерфейсе видеть не должен!
      return "Для $varName не выполнено правило $rule";
    }
  }
 
  /* Получает имя функции-валидатора из правила валидации
   */
  protected function validatorName($rule)
  {
    $delPos = strpos($rule, ':');
    
    return !empty($delPos) ?
          substr($rule, 0, $delPos)
        : $rule;
  }
 
  /* Получает список аргументов функции валидатора из правила валидации
   */
  protected function validatorArgs($rule)
  {
    $validatorArgs = explode(':', $rule);
    unset($validatorArgs[0]);
    return $validatorArgs;
  }
 
  /* Проверяет одно правило валидации для указанной переменной
   */
  public function validate($varName, $rule)
  {
    $validatorFunctionName = $this->validatorName($rule);
    $validatorFunctionArgs = $this->validatorArgs($rule);
    $varReference = &$this->getVarReference($varName);
 
    return call_user_func_array(self::$validators[$validatorFunctionName], array_merge(
      [$varReference],
      $validatorFunctionArgs
    ));
  }
 
  /* Возвращает ссылку на проверяемую переменную.
   * Ссылки использованы вместо значений, что бы можно было так же писать
   * функции-фильтры, которые будут обрабатывать входные данные, а не только проверять.
   * Вообще, логически, эту функцию следовало бы вынести куда-то отдельно, но тут
   * она достаточно удобна.
   */
  public function &getVarReference($varName)
  {
    $varNameArr = explode(':', $varName);
 
    if (count($varNameArr) == 1) {
      return $this->defaultVarSource[$varName];
    } else if (in_array($varNameArr[0], ['REQUEST', 'GET', 'POST', 'FILES', 'COOKIE'])) {
      $srcName = "_" . $varNameArr[0];
      global $$srcName;
      return ${$srcName}[$varNameArr[1]];
    } else {
      // Сообщения об ошибках на русском, что бы ТС было понятнее
      throw new Exception('Неправильный источник данных для валидации');
    }
  }  
}
 
// === НЕСКОЛЬКО РАЗЛИЧНЫХ ФУНКЦИЙ ВАЛИДАТОРОВ ===
 
/* Вернёт FALSE, если строка слишком длинная, или число слишком большое
 */
Validator::addValidator('max', function ($var, $max) {
  if (is_numeric($var)) {
    return ($var <= $max);
  } else if (is_string($var)) {
    return (strlen($var) <= $max);
  } else {
    return false;
  }
});
 
/* Вернёт FALSE если строка слишком короткая, или число слишком маленькое
 */
Validator::addValidator('min', function ($var, $min) {
  if (is_numeric($var)) {
    return ($var >= $min);
  } else if (is_string($var)) {
    return (strlen($var) >= $min);
  } else {
    return false;
  }
});
 
Validator::addValidator('!empty', function ($var) {
  return !empty($var);
});
 
Validator::addValidator('required', function ($var) {
  return isset($var);
});
 
Validator::addValidator('match', function ($var, $pattern) {
  return (boolean)preg_match("/^$pattern\$/", $var);
});
 
Validator::addValidator('email', function ($var) {
  return (boolean) filter_var($var, FILTER_VALIDATE_EMAIL);
});
 
Validator::addValidator('strip_specials', function (&$var) {
  $var = filter_var($var, FILTER_SANITIZE_SPECIAL_CHARS);
  return true;
});
Самих функций валидаторов можно написать сколько угодно, на все случаи жизни. Например, можно написать валидатор, проверяющий существование с БД пользователя с указанным именем.

Применительно к коду ТС будет что-то вроде:

PHP
1
2
3
4
5
6
$validator = Validator::make([
  'name' => 'required|match:[A-Za-z0-0]*|min:3|max:6',
  'content' => 'required',
  '_file_name' => 'required|file_name',
  'cat' => 'required|match:[А-Яа-я\s]*'
], $_POST);
Ну, и необходимые сообщения об ошибках прописать нужно и вывести пользователю, если они появятся. Тут, конечно, нужно не забыть сохранить все введённые им данные. Например, отправив обратно и заполнив форму, которую он редактировал.

Следующим шагом на правильном пути будет внедрение редактора на BB кодах (например, http://www.tinymce.com/). Или хотя бы написать фильтр с помощью того же валидатора, который вызовет strip_tags. Это не позволит пользователям по ошибке, или со злым умыслом вставлять произвольный код, который, как уже в теме этой упоминалось, может делать что угодно с вашим сервером!

В общем, не обессудьте, если есть косяки, т.к. ночь не спал и писал всё под утро Если будете использовать - тестируйте всё!.. Дважды)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.08.2014, 08:50
Помогаю со студенческими работами здесь

Проверка кода,удаление и начисление бонуса
Здравствуйте!Подскажите пожалуйста,не могу никак понять,как сделать аналог системы ваучеров? Требуется чтобы пользователь ввел...

Проверка кода капчи на PHP+Javascript
Приветствую, есть страница контактов на сайте, на которой установил генерацию картинки капчи (внешний php фаил). На самой странице...

Проверка присутствия своего html кода на стороннем сайте
как проверить присутсвие своего html кода(баннер 88х31) на стороннем сайте если код установлен о сделать ubdate в базе пометку что код...

Формы и регулярные выражения (проверка правильности введенного кода товара)
Всем привет, я студент, и на данный момент учусь на web-дизайнера, скажу честно в программировании на PHP я зеленый, и задания по данному...

Проверка кода и советы по его улучшению. Генерация случайных чисел и проверка на уникальность
Привет народ! Занимаюсь изучением Java, захотелось реализовать выборку случайных чисел для лотереи. Вроде бы все прописал и программа даже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru