Ваши ф-ции для фильтрации данных.

1. Удаленный 06.04.2009 / 19:14
Добрый вечер.
Какие Вы используете ф-ции для фильтрации в формах ввода текста и GET-запросах?
Всмысле, ограничиваетесь стандартными (типа htmlspecialchars) или добавляете какие-то свои?

2. HOOF 06.04.2009 / 19:23
ещё некоторые знаки фильтрую smile и т.п.

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,гьегеб реальный эскапе стринги,фирмач D

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("'","&apos;'",$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. Ты сначала добавляешь слэши, а потом удаляешь их... smile
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) - как бы конструкция... smile

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
Я знаю что многоsmile просто сообщил, что бы особенно не доверяли проверке мыла. Хотя в 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 smile

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, ну я думаю это не так уж страшно, если не отобразится знак евро, или еще что нить в таком роде smile

102. balalayka 18.07.2011 / 14:30
Народ, помогите
Нашел скрипт Ckeditor - это визуальный редактор
В общем их безапасность ввода данных я не нашел...
Как фильттровать данные, если этот редактор юзает теги, например <strong></strong> <span style="font:19px"></span> ну и т.д. т.п

URL: https://visavi.net/topics/615