Ваши ф-ции для фильтрации данных.
1.
Удаленный (06.04.2009 / 19:14)
Добрый вечер.
Какие Вы используете ф-ции для фильтрации в формах ввода текста и GET-запросах?
Всмысле, ограничиваетесь стандартными (типа htmlspecialchars) или добавляете какие-то свои?
2.
HOOF (06.04.2009 / 19:23)
ещё некоторые знаки фильтрую
и т.п.
3.
Михаил (06.04.2009 / 19:23)
Смотря что и для чего фильтровать
4.
Удаленный (06.04.2009 / 19:25)
Ну в основном я спрашиваю.
5.
Titov (06.04.2009 / 20:24)
вот например иногда так делаю
<?
function filter($str) {
$str = htmlspecialchars($str);
$str = mysql_real_escape_string($str);
return $str;
}
$url = filter($url);
?>
6.
DmitryDick (06.04.2009 / 20:49)
Собрать в одну функцию все стандартные (=
7.
Дмитрий (06.04.2009 / 21:19)
я так фильтрую:
function bug($msg){
$msg=str_replace("\"","",$msg);
$msg=htmlspecialchars($msg);
$msg=str_replace("'","",$msg);
$msg=str_replace("\$","",$msg);
$msg=str_replace("$","",$msg);
$msg=str_replace("\\","", $msg);
$msg=str_replace("./","", $msg);
$msg=str_replace("%","", $msg);
$msg=str_replace("\0","", $msg);
$msg=mysql_escape_string($msg);
$msg=stripslashes(trim($msg));
return $msg;};
8.
Михаил (06.04.2009 / 21:20)
#7, а для чего это все вырезать?
9.
Дмитрий (06.04.2009 / 21:31)
Мих, я мускул учу, какой функцией фильтровать данные на мускул)
10.
Павел (06.04.2009 / 23:14)
7,наверна самая глупая функция,зачем сначала доба*** слеши а потом удалять?
11.
Михаил (06.04.2009 / 23:37)
#9, от sql-инъекций mysql_escape_string
12.
Андрюха (07.04.2009 / 05:45)
function check($var){
return mysql_escape_string(addslashes(htmlspecialchars($var,ENT_QUOTES)));
}
Вот моя
13.
Михаил (07.04.2009 / 09:15)
#12, эта функция трижды слэши добавит
14.
Arab (07.04.2009 / 09:34)
в чем разница между
mysql_escape_string и
mysql_real_escape_string ?
15.
Удаленный (07.04.2009 / 09:37)
14,гьегеб реальный эскапе стринги,фирмач
16.
Санёк (07.04.2009 / 11:53)
15, 2 функция учитывает кодировку.
17.
Дмитрий (07.04.2009 / 13:35)
11) учту сразу) а то гг ***)
18.
AlkatraZ (07.04.2009 / 18:28)
Уважаемые, не забывайте, что для каждой ситуации есть своя отдельная методика фильтрации.
Все зависит от того, что за данные (строка, число, двоичные данные) и что Вы с ними потом собираетесь делать.
---
Конечно можноь написать универсальный фильтр, подходящий для 80% случаев, но онт будет слишком громоздким.
Я лично, предпочитаю по другому.
19.
ктулху (07.04.2009 / 18:30)
18, согласен с тобой. лучше всего фильтровать регулярками каждую переменную, под свой формат данных. ну и текст естественно тупо экранировать.
20.
AlkatraZ (07.04.2009 / 18:30)
Для чисел, абсолютно надежно:
$var = intval($var);
или, если не хотите допускать отрицательных чисел (например для номера страниц)
$var = abs(intval($var));
21.
AlkatraZ (07.04.2009 / 18:34)
#19 регулярки очень тормозят скрипт, потому их использование оправдано только в крайних случаях.
---
Продолжу...
Для строковых данных, при занесении в базу MySQL надежно работает mysql_real_escape_string()
Как правильно заметили выше, эта функция правильно обрабатывает многобайтовые кодировки (UTF8)
Ну и желательно вначале проверить, включено ли magic_quotes если да, то использовать strip_slashes()
22.
AlkatraZ (07.04.2009 / 18:36)
Только учтите, что mysql_real_escape_string() избавляет от SQL инъекции при хранении данных в базе.
НО!!!
Не избавляет от XSS и прочих скриптовых уязвимостей.
Потому, если Вы потом данные выводите в браузер, то нужна дополнительная обработка
htmlspecialchars() или htmlentities()
23.
AlkatraZ (07.04.2009 / 18:38)
Если переменная используется в системных нуждах, особенно как в Моторе, определяет файл подключаемого модуля и др, то там нужна дополнительная фильтрация, возможно даже регулярными выражениями (чтоб исключить опасные команды).
24.
Сергей (07.04.2009 / 18:51)
21, смотря еще какие регулярки юзать, во многих случаях лучше юзать PERL (preg), но и иногда даже лучше и POSIX (ereg) (=
25.
Удаленный (07.04.2009 / 19:50)
24. а разница?
26.
Сергей (07.04.2009 / 20:01)
24, разница в скорости и в регулярных выражениях
где-то была статейка про увеличение скорости скрипта, вот там рассматривались регулярки (=
27.
Дэн (07.04.2009 / 20:38)
Олег +1, особенно про числа - всегда именно модуль+интвал юзаю и большего просто ненужно
28.
Роман (07.04.2009 / 23:36)
Вот альтернатива регулярки. Возвращает
true, если каждый символ в text является буквой либо цифрой.
<?php
. . .
if (ctype_alnum($text))
echo $text;
?>
29.
Иван (03.10.2009 / 14:23)
Обьясните пожалуйста. Вот например я создаю файл conf.php и в нём прописываю переменные и их значения. потом эти переменные вставляю в страницы в нужном месте. Как правельно их отфильтровать, если переменные и символьное и цифровое значение имеют
30.
Neformat (03.10.2009 / 14:32)
29, если в файл пишешь скриптом то
$var = intval($var); для цифровых значений
$var = htmlspecialchars(); для символьных
Но если ты вручную вписываешь в файл conf.php, а он потом инклудится везде - эти переменные фильтровать не нужно - они являются внутренними, а не приходят из вне.
31.
Иван (03.10.2009 / 14:55)
30 спасибо
32.
Андрей (22.10.2009 / 04:13)
Vot prjam iz skripta moego:
<?php
$name=mysql_real_escape_string(htmlspecialchars(stripslashes($_POST['name'])));
$name=str_replace("'","''",$name);
?>
33.
Александр (22.10.2009 / 04:33)
Делаю все так же, как написал Алькатраз
34.
Protus (22.10.2009 / 07:55)
function filter($text){
$text=str_replace('&','', $text);
$text=str_replace('$','', $text);
$text=str_replace('<','<', $text);
$text=str_replace('>','>', $text);
$text=str_replace('~','', $text);
$text=str_replace('`','', $text);
$text=str_replace('#','', $text);
$text=str_replace('*','', $text);
$text=str_replace('%','', $text);
return addslashes(trim(htmlspecialchars(stripslashes(chop($text)))));
}
Во как делаю, почти тоже самое.
35.
Михаил (22.10.2009 / 11:11)
$text=str_replace('&','', $text);
$text=str_replace('$','', $text);
$text=str_replace('<','<', $text);
$text=str_replace('>','>', $text);
$text=str_replace('~','', $text);
$text=str_replace('`','', $text);
$text=str_replace('#','', $text);
$text=str_replace('*','', $text);
$text=str_replace('%','', $text);
а это для чего?
36.
HOOF (22.10.2009 / 11:31)
34. Ты сначала добавляешь слэши, а потом удаляешь их...
chop() думаю тоже не к чему, достаточно trim()
+ желательно добавить mysql_real_escape_string()
37.
Михаил (22.10.2009 / 11:54)
mysql_real_escape_string() тогда вместо addslashes() можно добавить
38.
Артём (24.10.2009 / 14:50)
//Фильтрация цифр
function s1($str)
{
return abs((int)$str);
}
//Фильтрация текста
function s2($str)
{
global $MySQL;
$str = trim(htmlentities($str, ENT_QUOTES, 'UTF-8'));
if($MySQL) $str = mysql_real_escape_string($str);
return $str;
}
?>
39.
Михаил (24.10.2009 / 15:34)
return abs((int)$str);
C какой целью abs тут используется?
40.
HOOF (24.10.2009 / 15:53)
39. abs() модуль числа, т.е. только положительные числа.
38. У меня почти такая же функция для цифр. Ещё насколько я знаю
intval() быстрее
(int)
41.
Михаил (24.10.2009 / 16:04)
#40, а зачем только положительные числа? Часто любые нужны
42.
HOOF (24.10.2009 / 16:07)
Чтобы, например, не было глюка при MySQL запросе, типа хотел + (прибавить что то), а кто то написал -, и получилось что отнял. Мне например чаще положительные числа нужны...
43.
Артём (24.10.2009 / 23:17)
40,вообще то наоборот ,быстрее (int) чем intval
44.
HOOF (25.10.2009 / 06:00)
43. Блин точно, чё то я тупанул, ведь intval() - функция, а (int) - как бы конструкция...
45.
Сергей (25.10.2009 / 11:43)
41, скорее реже, где ты так часто используешь отрицательные значения?
46.
Михаил (25.10.2009 / 22:24)
#45, например в админке при добавлении разделов есть пункт "положение на странице". Если уже есть раздел с номером 1, то чтобы вставить раздел в самый верх пришлось бы сдвигать все. А так ставлю -1 и он показывается выше чем 1.
47.
inferno1392 (25.10.2009 / 23:34)
46, а хранить все в некой последовательности, в которой реализован метод вставки в начало не вариант? вообщем-то все же соглашусь, что чаще требуются именно положительные числа
48.
ion (28.10.2009 / 08:01)
Ни один фильтр не помогает против этого ██████████████████████████████████████████████████████ всего таких выкидов! что сделать?
49.
ion (28.10.2009 / 08:02)
в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€в–€ авот это выглядить в кодировке ANSI
50.
Артём (28.10.2009 / 20:22)
48,регулярка есть
51.
ion (29.10.2009 / 10:48)
Какая регулятка?
52.
Александр (03.11.2009 / 02:25)
для string в бд:
function safe_sql ($query) {
if ($connect) {
return mysql_real_escape_string($query, $connect);
} else {
return mysql_escape_string($query);
}
}
для цифр, abs, intval, ctype_digit, is_int
Против XSS htmlspecialchars & others.
53.
Александр (03.11.2009 / 02:29)
ion, пиши регулярку что бы пропускала токо то что тебе надо...
Только не делай как делают некоторые умники здесь... пишутрегулярку которая не пропускает указанные символы.Все там указать нельзя.В итоге получается говнокод, в принципе... большая, больше чем большая ))) часть скриптов здесь и есть говно, не только изза ^^ ))
54.
Михаил (03.11.2009 / 10:53)
#48, против этого должен быть бан
55.
ion (04.11.2009 / 19:21)
52. Всё это у меня стоит и проходит все на ура это фигня! Так что это ни куда не годится! Так что спасибо но не то!
56.
ramzes (04.11.2009 / 19:42)
#48 iconv('windows-1251','utf-8',$text);
так попробуй, в потом проверяй и фильтруй.
preg_match('|^[a-z0-9\.\_\-]+$|iu',$text)
Например.
57.
ion (05.11.2009 / 05:14)
48. Респект! Плюс один
58.
CROWS (05.11.2009 / 10:30)
моя тема)))
59.
Славик (06.03.2010 / 15:57)
Новая функция фильтрации реализована с 5/2php
http://webpeeps.ru/article/12/
60.
ramzes (06.03.2010 / 18:52)
Там в проверке мыла баг говорили, можно в неверном формате подсунуть.
61.
ктулху (07.03.2010 / 00:29)
60, там видов фильтров много... мыло можно дополнительно регулярочкой
62.
ramzes (07.03.2010 / 00:42)
Я знаю что много
просто сообщил, что бы особенно не доверяли проверке мыла. Хотя в 5.3 вроде бы исправили, или даже раньше..
63.
coca-coca (07.03.2010 / 01:36)
ion (28.10.09 / 08:01)
Ни один фильтр не помогает против этого ██████████████████████████████████████████████████████ всего таких выкидов! что сделать?
http://upwap.ru/775049
в этом архиве есть класс для работы с UTF-8, в нём же имеется метод is_utf8 или is_utf (не помню), он помогает избавиться от такой хренотени. Изучай.
64.
coca-coca (07.03.2010 / 01:45)
PS тема про валидацию e-mail стара как яйца дедушки Ленина.
Я вообще пришёл для себя к "оптимальному" выводу, что лучше использовать список "доверенных" почтовых сервисов (типа yandex,mail,gmail,bmail). И не трахать свой мозг изобретением велосипедов на PCRE)
65.
Azzido (07.03.2010 / 10:28)
Хм, даже не подозревал о существовании функции фильтрации в php
66.
Андрей (12.03.2010 / 21:57)
А от XSS кроме htmlspecialchars, что еще прокатит?
67.
HOOF (13.03.2010 / 04:41)
66. htmlentities ))
68.
Удаленный (13.03.2010 / 05:05)
66#
strip_tags();
stripslashes() ;
69.
Azzido (14.03.2010 / 15:22)
stripslashes обратные слэши вырежет,а от хss не поможет.
70.
Михаил (14.03.2010 / 22:22)
Shaxter (12.03.10 / 21:57)
А от XSS кроме htmlspecialchars, что еще прокатит?
Этого достаточно
71.
Андрей (14.03.2010 / 23:08)
Flyd (Сегодня / 22:22)
Этого достаточно
Я знаю, думал вместо него че нить есть... но уже не надо...
72.
SirkO (30.03.2010 / 23:46)
function in ($t) {
return htmlentities(trim($t), ENT_QUOTES, 'UTF-8');
}
это для даных, которые в базу идут (посты на форуме и т.д.)
mysql_escape_string() для запросов
abs(intval($value)) - для числовых даных
и все....
73.
Azzido (31.03.2010 / 07:46)
72, mysql_escape_string() пора заменить на mysql_real_escape_string() в связи с переходом на новые версии php а для чисел не нужно применять функции, достаточно объявления типа переменной и все (int)$value, вот что верно это использование htmlentities(trim($t), ENT_QUOTES, 'UTF-8') с указанием кодировки, это грамотно и актуально
74.
WCO (31.03.2010 / 11:20)
function int();
function str();
// этого хватит
75.
SirkO (01.04.2010 / 21:54)
73.
Azzido, спасибо, буду знать)
76.
Replikon (03.04.2010 / 02:15)
Подскажите, при занесении записи в базу можно ли одной лишь addslashes () при выключенных магических кавычках защитить скрипт?
77.
Replikon (03.04.2010 / 10:45)
Ау, тут есть кто-нибудь?
78.
Azzido (05.04.2010 / 06:51)
76, этого вполне достаточно для простых запросов для защиты от инъекции, но лучше все таки mysql_real_escape_string(), но на теги тоже надо фильтровать
79.
chiper (14.04.2010 / 16:53)
я mysql_real_escape_string() не использую. я перевожу кавычки в хтмл сущьность. типа того '
тоесть в запросе она уже не имеет никакой силы
80.
WCO (14.04.2010 / 17:31)
^^ скул инъекции не тревожат?
81.
Neformat (16.04.2010 / 00:07)
ChipеR (14.04.10 / 16:53)
я mysql_real_escape_string() не использую. я перевожу кавычки в хтмл сущьность. типа того '
тоесть в запросе она уже не имеет никакой силы
ну да, а без ковычки скл иньекцию теперь отменили...
82.
Neformat (16.04.2010 / 00:09)
SirkO (30.03.10 / 23:46)
function in ($t) {
return htmlentities(trim($t), ENT_QUOTES, 'UTF-8');
}
Зачем стандартную функцию загонять в функцию? В чем экономия то... в количестве символов в имени функции что ли?
83.
Max (22.04.2010 / 09:18)
Интересует, что происходит с переносами на сл.строку вида \r\n после обработки real-escape-string
84.
Azzido (22.04.2010 / 09:52)
83.
BlаcKaXeS, они просто тупо экранируются бэкслэшами, и при выборке из базы так и останутся переносами
85.
Max (22.04.2010 / 11:19)
Хм... это выходит мне при выводе информации надо применять \r\n -> <br/> ?
86.
Дмитрий (22.04.2010 / 16:51)
да, и ещё от хсс обрабатывать на выводе (если конечно при записи ты это всё не делаешь)
87.
DmitryDick (23.04.2010 / 22:13)
85, nl2br()
88.
Azzido (24.04.2010 / 11:15)
87, к сожалению она заменяет только \n а \r никуда не девается и может быть воспринято как еще один перенос
89.
Михаил (24.04.2010 / 18:39)
\r это не перенос, это символ возврата в начало строки
90.
Azzido (25.04.2010 / 14:51)
Но если стоит один,без \n,после применения nl2br то расценивается как перенос
91.
ComatoZZZ (07.11.2010 / 01:30)
Входящий текст в GET запросах не фильтрую.
92.
Владислав (07.11.2010 / 09:24)
function protect($string) {
return mysql_real_escape_string(trim(htmlentities($string, ENT_QUOTES, 'UTF-8')));
}
function int($string) {
return abs((int)$string);
}
93.
KOZZ (07.11.2010 / 12:20)
92, зачем htmlentities то там? и без него нормально будет
94.
Александр (07.11.2010 / 12:24)
93, нормальная xss?
95.
KOZZ (07.11.2010 / 12:31)
94, вывод через htmlspecialchars и все, никакой xss ты не сделаешь
96.
Александр (07.11.2010 / 13:03)
95, выводя после тратишь лишнее процессорное время, если в тексте мало html лучше фильтровать в начале, жертвуя пару килобайтам места в бд.
97.
KOZZ (07.11.2010 / 13:13)
96, так я имею ввиду фильтрацию при входе через mysql_real_escape_string() + вывод через htmlspecialchars()
а про экономию проц.времени - при нормальной структуре это экономия на спичках
98.
Azzido (07.11.2010 / 14:06)
97.
eGo, все таки лучше использовать htmlentities а не htmspecialchars, избежишь большинства трабл с некоторыми браузерами
99.
KOZZ (07.11.2010 / 15:48)
98, каких например проблем?
100.
Azzido (07.11.2010 / 16:18)
99.
eGo, неотображение некоторых символов в ie6 и некоторых других браузерах, и не надо говорить что этими браузерами никто не пользуется, тысячи людей еще даже не подозревают что он уг и существуют и другие
101.
KOZZ (07.11.2010 / 17:30)
100, ну я думаю это не так уж страшно, если не отобразится знак евро, или еще что нить в таком роде
102.
balalayka (18.07.2011 / 14:30)
Народ, помогите
Нашел скрипт Ckeditor - это визуальный редактор
В общем их безапасность ввода данных я не нашел...
Как фильттровать данные, если этот редактор юзает теги, например <strong></strong> <span style="font:19px"></span> ну и т.д. т.п
URL:
https://visavi.net/topics/615