Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Непонятная функция - помогите разобраться

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Без описания
Hapson
Отправлено: 17 Июня, 2013 - 19:55:49
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Набрел тут недавно на одну пользовательскую функцию...
Здесь
Проверка полей ввода логина/пароля

CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. function html($_POST) {
  3.    $_POST = is_array($_POST) ? array_map('html', $_POST) : htmlspecialchars ($_POST);
  4.    return $_POST;
  5. }
  6.  
  7. $_POST = array_map('html', $_POST);
  8. ?>

Цитата автора:
Цитата:
Благодаря этой проверке нас будет сложнее взломать. Например, такая конструкция уже не пройдет:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <script>alert("hack")</script>


Вот третий день уже на нее смотрю, но понять не могу. Также что-то не доходит до меня array_map()
Это тут что-то типа рекурсии? Или как?


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
LIME
Отправлено: 17 Июня, 2013 - 19:58:46
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




да
тут рекурсия
ф-ция глупейшая
и должно быть нерабочая
 
 Top
teddy
Отправлено: 17 Июня, 2013 - 20:08:47
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Кстати, раз уж пошла такая тема, вероятно ее прочтут опытные специалиты и я хотел бы паралельно получить совет. Сам фильтрую так:

PHP:
скопировать код в буфер обмена
  1. $str = $db->real_escape_string(trim($_POST['str']));
  2.     if(!preg_match("/^[а-яА-ЯёЁ]+$/",$str)){
  3.         $error_str = "Разрешены только Русские буквы";
  4.     }


Насколько оно безопасно? Есть у кого более приемлимый вариант? Стоит ли использовать всякие strip_tags-ы или htmlspecialchars-ы в дополнение или достаточно того, что я написал выше?

Для чисел использую
 
 Top
LIME
Отправлено: 17 Июня, 2013 - 20:15:39
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




этот способ тоже глупый потому что preg_match("/^[а-яА-ЯёЁ]+$/",$str) УЖЕ не пропустит управляющих символов а значит real_escape_string не нужен
htmlspecialchars применяется если присланные данные будут выводиться в браузер
например при регистрации я могу указать вместо имени строку <script>window.location.href="http://mysite.ru"</script>
и если на странице выводится какой-нибудь список имен юзеров то все будут перенаправлены на мой сайт
 
 Top
teddy
Отправлено: 17 Июня, 2013 - 20:22:33
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




LIME
Странно, я слышал что на один preg_match нельзя полагаться, вспомнил и решить уточнить здесь, правда мне не объясняли каким именно образом это можно провернуть, но помню что писали во весь "голос" что бы не полагался на один прег_матч...

LIME пишет:
<script>window.location.href="http://mysite.ru"</script>

Так preg_match же не пропустит, как ты собираешься это провернуть? ) Я что то не понимаю...

Я имею ввиду конкретный случай, с моим примером
 
 Top
Hapson
Отправлено: 17 Июня, 2013 - 20:23:19
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


LIME
Спасибо. С первым понятно.
А я вот че написал у себя
CODE (htmlphp):
скопировать код в буфер обмена
  1. if(!empty($_POST['auth'])){
  2.         //заполнены ли поля?
  3.         if((empty($_POST['login']) || empty($_POST['password'])) || (!preg_match("/^[a-zA-Z0-9]{1,15}$/", $_POST['login']) || !preg_match("/^[a-zA-Z0-9]{1,15}$/", $_POST['password']))){
  4.                 echo 'Проверьте правильность заполнения полей';
  5.         }


Это нормально? Достаточно ли для проверки полей?


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
EuGen Администратор
Отправлено: 17 Июня, 2013 - 20:25:35
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




teddy
Корректнее (если нужна только кириллица) использовать hex-представление (это будет независимо от локали). Например,
PHP:
скопировать код в буфер обмена
  1. if(preg_match('/^[\xC0-\xFF]+$/', $sData))
  2. {
  3.    //valid cyrillic string
  4. }

На будущее - обязательно создавайте новую тему


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 17 Июня, 2013 - 20:36:55
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




teddy пишет:
Я имею ввиду конкретный случай, с моим примером
регулярки хватит за глаза
даже трим не нужен
EuGen пишет:
использовать hex-представление (это будет независимо от локали)
а это как понимать? можно подробнее?
 
 Top
EuGen Администратор
Отправлено: 17 Июня, 2013 - 20:52:15
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




LIME
а-яА-Я есть не везде (локаль нужна), а \xC0-\xFF есть везде.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 17 Июня, 2013 - 21:15:49
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




наверное я плохо понимаю как работают локали но
причем тут вообще локаль?
разве "а" это не 2байта по сути?
и а-я это не диапазон в таблице между цифрами а(2б) и я(другие 2б)?
и разве "a" не эквивалентно полностью его же написанию в нех?

(Отредактировано автором: 17 Июня, 2013 - 21:21:30)

 
 Top
EuGen Администратор
Отправлено: 17 Июня, 2013 - 21:27:28
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




LIME пишет:
разве "а" это не 2байта по сути?

Нет. Сохраните файл в cp - будет 1 байт. В UTF8 - 2 байта. А если в системе нет русской локали, то это "а" в тексте вообще будет нераспознано (и это не компилятор, что сделал бинарный файл - и готово, его вообще-то интерпретатор читает каждый раз). И распознаться оно может как угодно - информация в строке без кодировки смысла не имеет. Да и правка такого файла будет невозможна. Но вот hex-коды универсальны.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 17 Июня, 2013 - 21:31:47
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




EuGen пишет:
cp - будет 1 байт
я имел ввиду именно utf для краткости изложения
EuGen пишет:
А если В системе нет русской локали, то это "а" в тексте вообще будет нераспознано
я думал его вообще не "распознают"
просто берут символ с этим кодом и ищут в строке такой же код
кроме случаев с модификатором i или подобных
где важна локаль
имхо это тема для статьи
хотелось бы подробного освещения
(Добавление)
кажется догоняю
я считал что таблица utf существует вся "целиком"
видимо в этом ошибка...да?
 
 Top
EuGen Администратор
Отправлено: 17 Июня, 2013 - 22:00:42
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Символ, записанный в файл, представляется как набор байт, да. А вот то, что с ним делать - как отображать, как с ним работать - будет решать уже работающая с данными система. Представьте, что Вы запишете в UTF букву "а" - два байта. А затем попытаетесь этот файл исполнить в PHP там, где UTF отсутствует и есть только однобайтная кодировка. Эти два байта будут распознаны как два символа - то есть некорректно.
Иными словами, чтобы работа была корректной, и читающий и пишуший должны придерживаться одних правил письма и распознавания (читайте - протокола). Поэтому не уверен, что тут нужна статья. Символы же шестнадцатиричного представления будут записаны унифицировано. Вернее сказать так - из-за особенности UTF-8, в котором символы первой половины ASCII представляются одним байтом, это самое "\xC0" (внимание - это строка из 4-х символов) представится как 4 байта "\", "x", "C", "0" - что в UTF-8, что в cp (или другой однобайтовой кодировке) - потому что однобайтовые кодировки имеют кодовые страницы, в которых первая половина таблицы символов совпадает у каждой из них и совпадает с тем же ASCII, а, значит, и с UTF-8.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
teddy
Отправлено: 17 Июня, 2013 - 22:39:25
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




EuGen
Интересно, спасибо за полезную информацию! Кстати, регулярка, которую вы написали считает не валидным буквы ёЁ, а все остальное вроде как работает корректно ) Как быть в таком случае? если добавить еЁ вручную, то опять же могут быть проблемы, как вы уже писали выше..


LIME пишет:
трим не нужен

Да, эт я с дуру влепил ) при таком выражении не нужен точно, думаю..

(Отредактировано автором: 17 Июня, 2013 - 22:41:04)

 
 Top
EuGen Администратор
Отправлено: 17 Июня, 2013 - 22:57:10
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




teddy
Записать их hex-коды отдельно, разумеется (не спрашивайте значения кодов - если сами дойдёте, то станете лучше понимать, что такое кодировки).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB