$_POST и S_GET
1.
Don (01.02.2012 / 14:23)
Нужна практика, я знаю как тупо вставлять через пост и гет сообщения, знаю как фильтровать, мне нужно узнать еще способы защиты как защитить от символов не нужных или еще что то просто может что то упустил, знаю функцию trim для пробелов, функция strip_tegs помоему для html тегов еще что есть?
2.
Hennessy (01.02.2012 / 14:39)
htmlspecialchars
mysql_real_escape_string
больше, в принципи, ничего не надо
3.
Makc (01.02.2012 / 14:41)
Hennessy (1 Февраля 2012 / 14:39)
htmlspecialchars
mysql_real_escape_string
больше, в принципи, ничего не надо
и ещё intval
4.
spamerok (01.02.2012 / 14:41)
да есть. Открой мануал по пхп и функции для работы со строками. И узнаешь много нового и интересного.
5.
Don (01.02.2012 / 14:41)
а нельзя функцию какую нибудь написать для защиты отправки пост и гет?*
6.
Hennessy (01.02.2012 / 14:42)
Можно...например:
//Фильтрация данных.
function nohack($nohack)
{
$nohack = trim(htmlspecialchars(mysql_real_escape_string($nohack)));
return $nohack;
}
7.
Удаленный (01.02.2012 / 14:43)
текст который получаешь в POST прогоняй через например для защиты от ссылок или матов
str_replace
8.
KOZZ (01.02.2012 / 14:43)
function check_in($var){
return mysql_real_escape_string(trim(htmlentities($var, ENT_QUOTES, 'UTF-8')));
}
9.
Don (01.02.2012 / 14:45)
а в php.in есть каки нибудь настройки связаны с защитой? передачи данных через эти параметры?
Добавлено через 01:17 сек.
мм увидел много интересных функций пойду учить
10.
KOZZ (01.02.2012 / 14:53)
9.
Suleiman, максимальный объем передаваемых данных если только
11.
Андрюха (01.02.2012 / 15:04)
по моему не нужно создавать функции свои для обработки. Зачем если надо записать в базу,юзать функцию из 8 поста? Зачем если мне ток вывести нужно,юзать функцию из 8 поста?
12.
Дмитрий (01.02.2012 / 15:10)
1.
Suleiman, Здесь все предельно просто, нужно лишь точно знать какие данные должен содержать тот или иной элемент глобального массива, например если гет[ид] вы точно знаете должно использоваться значение число, то вырезать здесь нечего нужно лишь пользоваться фильтрами с 5 версии пхп поддерживать свыше 20 фильтров если текс - htmlspecialchars, а если бд то сама обертка бд должна или автоматически фильтровать, подобно AR во многих фреймворках либо предоставлять свои интерфейсы для ручной работы - никаких своих ф-ций в идеале придумывать не зачем. ИМХО
13.
Андрюха (01.02.2012 / 15:24)
12. И я того-же мнения
14.
Don (01.02.2012 / 15:26)
какие есть не достатки у get ?
15.
Удаленный (01.02.2012 / 15:28)
14.
Suleiman, все параметры передаваемые видны в ссылке
16.
Дмитрий (01.02.2012 / 15:31)
15.
MaZaHaKeR, Это недостатки,А где их должно быть видно? используй $пост, $глобал, $сесион их в урл строке не видно
17.
Удаленный (01.02.2012 / 15:32)
Я и говорю что в гет все видно в ссылке. Лучше пост использовать
18.
Дмитрий (01.02.2012 / 15:36)
17.
MaZaHaKeR, Он то про недостатки спрашивал, какие тут могут быть недостатки хз
19.
Удаленный (01.02.2012 / 15:41)
ну например в пост можно файлы передавать а в гет нельзя
20.
Hennessy (01.02.2012 / 15:51)
В гет тоже вроде бы можно.
21.
Удаленный (01.02.2012 / 15:53)
20.
Hennessy, я где то читал что нельзя потому что запросы текстовые
22.
Дмитрий (01.02.2012 / 15:56)
19.
MaZaHaKeR, так это уже не пост запрос , а пат запрос (put) не стоит путать, это разные вещи даже обращение уже не к $_POST, А К $_FILES это 2 разных глобальных массива ровно как методы запросов
23.
Zдешний (01.02.2012 / 15:59)
urlencode и urldecode и в строке много чего будет видно
24.
Удаленный (01.02.2012 / 16:00)
22.
akawin, значит источник мне наврал)
Добавлено через 05:34 сек.
Главное различие
$_POST при передачи данных из формы
$_GET при передачи данных из адресной строки
25.
KOZZ (01.02.2012 / 16:08)
11.
Wapruks, как зачем, чтобы не допустить ошибок и уязвимостей при записи в базу.
26.
Артур (01.02.2012 / 17:44)
Предпочитаю добавлять в методы интерфейса класса предусловия с проверкой типов и т.д., а внутри уже будешь уверенным в том, что данные корректны. Плюс возможность определения типа аргумента функции для объектов и массивов самое то
27.
Don (01.02.2012 / 18:27)
20. Помоему нельзя передавать ))
28.
KOZZ (01.02.2012 / 18:37)
26.
Bashka, не понял немного. пример банальный какой нибудь можешь показать?
29.
Don (01.02.2012 / 18:44)
MaZaHaKeR (1 Февраля 2012 / 16:00)
22. akawin, значит источник мне наврал)
Добавлено через 05:34 сек.
Главное различие
$_POST при передачи данных из формы
$_GET при передачи данных из адресной строки
я тоже что то читал что вообще нельзя выполнить ни коем образом методот гет.. закачка файла на сервер..
30.
ramzes (01.02.2012 / 18:57)
Suleiman (1 Февраля 2012 / 18:44)
я тоже что то читал что вообще нельзя выполнить ни коем образом методот гет.. закачка файла на сервер..
файл отправляется через POST, а потом уже заносится в глобальный массив FILES
31.
Don (01.02.2012 / 19:30)
30. понятно ))) просто хотел узнать какие подводные камни существуют в гет и в пост))))
32.
Don (01.02.2012 / 20:50)
во че то соорудил со своими примочками ))
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
$name = trim(strip_tags($_POST['name']));
$age = abs((int)$_POST['age']);
}
?>
<form action="<?=$_SERVER['PHP_SELF']?>" method='post'>
<input type="text" name="name" value="<?=$name?>"><br />
<input type="text" name="age" value="<?=$age?>">
<input type="submit" value="ok">
</form>
<?php
if($name and $age){
echo 'Меня зовут: '.$name;
echo '<br/>';
echo 'Возраст: '.$age;
}
?>
кто бы че еще добавил?)) модефикация типо) с комментариями если можно))
33.
KOZZ (01.02.2012 / 20:54)
if($_SERVER['REQUEST_METHOD'] == "POST") {
ни разу такого не видел ))
я делаю так:
if(count($_POST)>0)
хотя предпочитаю такое:
<?
$save = (isset($_GET['save'])) ? true : false;
if($save){
if(isset($_POST['name']) && !empty($_POST['name'])){
.......
}
} else {
?>
<form action="?save" method="post">
<input type="name" value="" />
<input type="submit" />
</form>
<?
}
?>
34.
ramzes (01.02.2012 / 20:57)
If(isset($_POST['name'])) достаточно
35.
KOZZ (01.02.2012 / 20:59)
34.
ramzes, кстати если так делать, то можно напороться на null значение / null байт, и этот isset вернет false (http://php.su/functions/?isset)
по хорошему, надо array_key_exists, либо совмещать с !empty()
Добавлено через 01:27 сек.
P.S: хотя сам по привычке юзаю isset
36.
Артур (01.02.2012 / 21:05)
28.
eGo Надежный Дядька, приведу абстрактный. Предположим есть функция с такой семантикой имя(строка а, число б, массив в, объект г) при этом предусловия требуют чтобы аргумент а не содержал точек, аргумент б был положительным, а аргумент в был не пустым массивом. Пишем функцию с предусловием:
<?php
function name($a, $b, array $c, object $d){
// предусловия
if(!is_string($a) || strpos('.', $a) !== false) throw new \Exception('...');
if(!is_integer($b) || $b < 0) throw new \Exception('...');
if(!count($c)) throw new \Exception('...');
// тело функции
...
}
?>
примерно так
37.
Don (01.02.2012 / 21:05)
!empty помоему лучше юзать как ты сказал чисто из за Null, а isset как второстепенно наверно использовать
38.
Дмитрий (01.02.2012 / 21:05)
isset($_POST) .. пост данные ;
реквест_метод тут не решает ничего запрос в заголовках может быть написан пост, а данные не передаваться или передаваться другим способом, а не через массив $_пост
39.
ramzes (01.02.2012 / 21:06)
Не надо ни чего совмещать.
Все равно проверять минимальную длинну строки, после трим() иначе три пробела можно отправить, или например подменить собой админа в бд. ___админ (_ - пробел)
40.
KOZZ (01.02.2012 / 21:07)
38.
akawin, isset($_POST)
$_post существует даже когда данные не отправлены.
41.
Don (01.02.2012 / 21:08)
Bashka (1 Февраля 2012 / 21:05)
28. eGo Надежный Дядька, приведу абстрактный. Предположим есть функция с такой семантикой имя(строка а, число б, массив в, объект г) при этом предусловия требуют чтобы аргумент а не содержал точек, аргумент б был положительным, а аргумент в был не пустым массивом. Пишем функцию с предусловием:
<?php
function name($a, $b, array $c, object $d){
// предусловия
if(!is_string($a) || strpos('.', $a) !== false) throw new \Exception('...');
if(!is_integer($b) || $b < 0) throw new \Exception('...');
if(!count($c)) throw new \Exception('...');
// тело функции
...
}
?>
примерно так
твой пример для меняя по сложнее видима потому что никогда я не сталкивался
throw new Exception - это походу классы да?
42.
Артур (01.02.2012 / 21:08)
А проверку гета и поста выношу в предусловия внешнего контролера (ну иль внутреннего, разницы нет)
43.
Дмитрий (01.02.2012 / 21:09)
Bashka (1 Февраля 2012 / 21:05)
28. eGo Надежный Дядька, приведу абстрактный. Предположим есть функция с такой семантикой имя(строка а, число б, массив в, объект г) при этом предусловия требуют чтобы аргумент а не содержал точек, аргумент б был положительным, а аргумент в был не пустым массивом. Пишем функцию с предусловием:
<?php
function name($a, $b, array $c, object $d){
// предусловия
if(!is_string($a) || strpos('.', $a) !== false) throw new \Exception('...');
if(!is_integer($b) || $b < 0) throw new \Exception('...');
if(!count($c)) throw new \Exception('...');
// тело функции
...
}
?>
примерно так
А почему вы не используете для обработки try {} cath (){}
44.
Артур (01.02.2012 / 21:10)
41.
Suleiman, это исключение. Если оно вызывается, то программа убивается, а тебе выводится то, что в кавычках у него. Исключения можно еще перехватывать. Короче ошибку генерируешь. Если сложно, то можно по старинке ретурн ЛОЖЬ
Добавлено через 01:55 сек.
43.
akawin, для обработки чего? Если в мою функцию передать неверные значения, она начинает убивать все, что ее вызвало. Пусть тот кто вызывает заботится об исключениях, а функция просто "воняет" при попытке передать ей мусор
45.
Дмитрий (01.02.2012 / 21:12)
40.
eGo Надежный Дядька, Эм... не уверен, его нет если нет данных, $_пост инициализируется только если что-то принято - механизм должен быть таким
46.
Артур (01.02.2012 / 21:13)
Есть принцип Близости - Однотипные операции группировать поближе, чтоб их проще было читать. Вот и выношу все проверки в одно место, а не по всему файлу их )
47.
KOZZ (01.02.2012 / 21:14)
45.
akawin, а ты проверь.
<?php
var_dump(isset($_POST));
?>
48.
Don (01.02.2012 / 21:14)
Bashka (1 Февраля 2012 / 21:10)
41. Suleiman, это исключение. Если оно вызывается, то программа убивается, а тебе выводится то, что в кавычках у него. Исключения можно еще перехватывать. Короче ошибку генерируешь. Если сложно, то можно по старинке ретурн ЛОЖЬ
Добавлено через 01:55 сек.
43. akawin, для обработки чего? Если в мою функцию передать неверные значения, она начинает убивать все, что ее вызвало. Пусть тот кто вызывает заботится об исключениях, а функция просто "воняет" при попытке передать ей мусор
у тебя интересное и не одинарное решение)) надо будет взяться снова за учебник)) пункты подскажи что учить??))
49.
KOZZ (01.02.2012 / 21:15)
Bashka, %)
не вывожу я твой код, не дорос наверное еще
50.
Артур (01.02.2012 / 21:17)
48.
Suleiman, почитай про исключения. Они обычно в главах о ООП.
51.
Дмитрий (01.02.2012 / 21:18)
44.
Bashka, Под моим вопросом подразумевалось почему исключения выбрасываются, а не перехватываются и не обрабатываются; полезнось такой функции -> 0
52.
ramzes (01.02.2012 / 21:22)
36.
Bashka, как то это очень громоздко выходит, в каждом методе кучу проверок делать..
Почему не вынести их в отдельный метод(ы) ?
53.
Артур (01.02.2012 / 21:23)
51.
akawin, выбрасываются, потому что вызывающий пытается использовать функцию не по назначению. Обрабатывать эти выбросы будет тот, кто передает мусор. Я не полностью понял о чем речь если честно. Вы предлагаете так:
<?php
...
// предусловия
if(...) try{
throw new Exception(...);
}catch(Exception $e){
...
}
...
// тело
...
?>
54.
Дмитрий (01.02.2012 / 21:25)
eGo Надежный Дядька (1 Февраля 2012 / 21:14)
45. akawin, а ты проверь.
<?php
var_dump(isset($_POST));
?>
Проверил, я не прав, решение проблемы:
if ($_POST) {
55.
Артур (01.02.2012 / 21:26)
52.
ramzes, не в каждом, только в public методах класса, которые принимают какие либо аргументы, закрытые же методы будут точно работать с корректными данными, ведь об этом позаботятся public методы. Почему не делать проверку в одном месте? А как же повторное использование классов? Я придерживаюсь идеи, что мои классы должны работать одинаково, независимо от окружения, в котором используются. Если выносить проверку во вне класса, то при изменении окружения кто то может забыть сделать проверку и передать мусор, а класс не заметит. В моем случае класс всегда ко всему готов. Да и так проще на мой взгляд
Добавлено через 01:35 сек.
52.
ramzes, вообще если проверки часто повторяются, то без проблем, выносим условия в отдельные внешние функции, и используем их в методе, суть от этого не меняется ) просто мы упаковываем код проверки в другом месте и все. Я показал абстрактный пример ;)
Добавлено через 07:43 сек.
Собственно говоря, если функция должна принимать в качестве аргумента ... то проверку делать в любом случае нужно, а ее централизация по моему сильного выигрыша в скорости не прибавляет. Если и бывает ситуация, когда какой то метод должен проводить сложные проверки и повторяться много раз, я этот метод пакую в приват и создаю один паблик метод, который отвечает за проверку условий и передачу их тому методу (вспомним про Заместителя). Выигрыш в скорости будет отличный
56.
ramzes (01.02.2012 / 21:51)
55.
Bashka, зато в скорости написания и понимания хороший выигрыш
а ради этого порой стоит и поступиться.
П.с. вот я как раз имел ввиду, публичный метод приема данных и приватный метод исполнения.
57.
Артур (01.02.2012 / 21:57)
56.
ramzes, а считаю самым важным повторное использование и модульность. Ради этого можно потратить лишние десять часов на написание кода, зато потом не придется переписывать похожие классы и функции. Могу ошибаться конечно. Вообще написание предусловий дело не сложное, потому редко упаковываю функции в приват. В ЖС написал небольшую функцию, которая позволяет определять типы аргументов на этапе интерпретации, потому там все еще проще
URL:
https://visavi.net/topics/29043