RFpro.ru: Программирование на PHP

  Все выпуски  

RusFAQ.ru: Программирование на PHP


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / PHP

Выпуск № 446
от 01.09.2006, 12:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 342, Экспертов: 44
В номере:Вопросов: 6, Ответов: 13


Вопрос № 53332: Привет эксперты, не знаю сюда мне писать или нет? В общем такой вопрос. Как такая штука реализована, может мне надо в другую рассылку писать Apache, но я её чёт не нашол или мало искал. Короче вот что. Посмотрите и расскажите как такое реализовать <b...
Вопрос № 53347: Привет, эксперты. Помогите разобраться. Если переменые куки, которые хранятся у юзера на компе, нужно предварительно проверить на наличие кавычек, чтобы не было sql-иньекции, то стоит ли проверять те переменные которые используются в сессиях также на...
Вопрос № 53355: Уважаемые эксперты! На днях поставил PHP 6. (Для меня, как для разработчика, очень важно быть в курсе самых последних изменений php). И возникла небольшая проблема: phpMyAdmin напрочь отказался работать, вываливаясь с кучей ошибок при старте. Чер...
Вопрос № 53366: Здравствуйте, дорогие эксперты! У меня вопрос. Недавно я задавала такой же, но обстоятельства изменились. В общем, мне нужно, чтобы если у пользователя один браузер - он попадал на одну страницу, другой - на другую. Какими средствам...
Вопрос № 53378: Уважаемые эксперты? помогите в такой проблеме. Есть база данных с именами и датами рождения пользователей (поля, допустим, name, b_day, b_month, b_year). Каким образом можно сделать, чтобы каждый день на главной странице отображалось, у кого из польз...
Вопрос № 53410: Здравствуйте! В продолжения вопроса 52105, минифорум http://rusfaq.ru/info/Question/52105. Как влияет на получение значения формы, если у этой формы есть имя. Например: <form name="drive" action = "http://localhost/acti...

Вопрос № 53.332
Привет эксперты, не знаю сюда мне писать или нет? В общем такой вопрос. Как такая штука реализована, может мне надо в другую рассылку писать Apache, но я её чёт не нашол или мало искал. Короче вот что. Посмотрите и расскажите как такое реализовать
http://konkurs.xakep.ru:83/
http://konkurs.xakep.ru:86/
http://konkurs.xakep.ru:89/
Через порт который указываеш загружаются разные странички.
Спасиюо.
Отправлен: 26.08.2006, 12:43
Вопрос задал: Александр Михайлович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: din
Здравствуйте, Александр Михайлович!
Все верно, это уже настройки Веб-сервера. При создании виртуального хоста указываешь на каком порту слушать, в приложении пример настроек для апач, который будет слушать на 81 и 82 порту. Скажем так, не самое изящное решение. Тут одно неудобство, пользователь может не указать порт, а по умолчанию всегда для http идет 80.

Приложение:

---------
Есть только одно зло - невежество, и только одно благо - знания

Ответ отправил: din (статус: Студент)
Ответ отправлен: 26.08.2006, 13:11


Вопрос № 53.347
Привет, эксперты. Помогите разобраться. Если переменые куки, которые хранятся у юзера на компе, нужно предварительно проверить на наличие кавычек, чтобы не было sql-иньекции, то стоит ли проверять те переменные которые используются в сессиях также на наличие кавычек. И если куки можно посмотреть у себя на компе в папке - Мои Документы и изменить, то где и как можно посмотреть и изменить значения переменных из сессии, где они хранятся, как узнать их имена? Я это спрашиваю, потому что беспокоюсь за безопасность своего движка.
И ещё один вопросик встречный - фильтровать надо для sql-иньекции только символ ['] или ещё и ["], т.е. может в настройках мускула можно изменить этот символ ограничитель. Спасибо.
Отправлен: 26.08.2006, 15:54
Вопрос задал: Александр Михайлович (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Stamm
Здравствуйте, Александр Михайлович!
Сессии храняться у хостера, обычно в папке /tmp. Имена примерно такие: sess_ac29341d94e5eeb4ac0f62f76c0b3ec2, так что взломать не удаться
Используйте функцию: mysql_real_escape_string(). А чтобы не писать везде эту функцию, можно создать новую функцию, но нужно договориться, что все запросы будут посланы только через эту новую функцию:
function new_query($sql){
return mysql_query(mysql_real_escape_string($sql));
}
---------
Этот мир обречён на нас
©Сергей Маврин
Ответ отправил: Stamm (статус: Практикант)
Ответ отправлен: 26.08.2006, 18:13

Отвечает: Cimus
Здравствуйте, Александр Михайлович!
На мой взгляд надо фильтровать одинарную кавычку, т.к. передав её сценарию можно изменить полностью логику запроса:
к примеру есть запрос- SELECT* FROM таблица WHERE `id`='1' если в качестве значения поля id передать строку вида 1' OR 1='1, в которой после числа 1 закрылась кавычка, и добавленны дополнительные параметры в запрос то получиться следующие SELECT* FROM таблица WHERE `id`='1' OR 1='1' , а это уже и есть атака на Вашу базу данных. Все управлящие символы имеют специальное значение только вне кавычек, иначе они будут расматриваться как литерал и непринесут вреда.
По поводу проверки переменных - я стораюсь проверить их в любом случае, вне зависимости от того откуда они пришли, правда значения полученные из сессий или базы данных я стораюсь проверять менее жёстко.


---------
Достичь можно любых высот !
Ответ отправил: Cimus (статус: 7-ой класс)
Ответ отправлен: 26.08.2006, 19:12

Отвечает: Евгений Крюков
Здравствуйте, Александр Михайлович!

Насчет фильтрования - есть несколько простых правил, которые сводят все попытки сделать инъекцию бесполезными. Во-первых, использование функции sprintf при подготовке запроса, второе - это mysql_real_escape_string, только в модифицированной форме( см. приложение)

Например, мои запросы выглядят примерно так:
$sql = sprintf("UPDATE ".CALC. " set
up_id=%u,
name=%s,
short_name=%s,
value=%s,
attr_type=%u,
ord=%u
WHERE id = %u",
$pup_id,
quote_smart($pname),
quote_smart($short_name),
quote_smart($pvalue),
$pattr_type,
$pord,
$pid
);

Приложение:

---------
Большинство ответов на вопросы в рассылках находиться через Яндекс за 1 мин.

Ответ отправил: Евгений Крюков (статус: Студент)
Ответ отправлен: 26.08.2006, 22:52


Вопрос № 53.355
Уважаемые эксперты!
На днях поставил PHP 6. (Для меня, как для разработчика, очень важно быть в курсе самых последних изменений php). И возникла небольшая проблема: phpMyAdmin напрочь отказался работать, вываливаясь с кучей ошибок при старте. Через некоторое время надоело работать с CMD, да и лень писать собственный скрипт, и я решил написать вам :).
Подскажите, пожалуйста скрипты работающие ! онлайн ! с MySQL, предоставляющие функции наподобие phpMyAdmin. (RST MySQL не подходит).
С уважением, Lockal
Отправлен: 26.08.2006, 17:32
Вопрос задал: Lockal (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Марк Крейн
Здравствуйте, Lockal!
phpMyAdmin при работе использует расширение php php_mysql.dll. Проверьте Ваш конфигурационный файл php.ini и при необходимости раскомментируйте следующую строку (раскомментировать - значит убрать начальный символ точки с запятой).

extension=php_mysql.dll

Если после этого ошибки продолжают появляться, проверьте правильность логина и пароля для доступа к MySQL.
Ответ отправил: Марк Крейн (статус: Студент)
Ответ отправлен: 26.08.2006, 18:19
Оценка за ответ: 5


Вопрос № 53.366
Здравствуйте, дорогие эксперты!
У меня вопрос. Недавно я задавала такой же, но обстоятельства изменились.

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

(Дело в том, что страницы у меня с расширением .PHP, т. е. как бы "собираются" из нескольких частей. Внизу приведен код страницы index.php, а еще ниже - код страницы centralindex.html, т. е . ее главной составляющей)

Заранее спасибо.

Приложение:

Отправлен: 26.08.2006, 19:31
Вопрос задала: Angel7 (статус: 2-ой класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Stamm
Здравствуйте, Angel7!
Можно сделать несколько папок, например, http://site.com/ie, http://site.com/opera для каждого браузера. На PHP сделать примерно такой код:
$br=$_SERVER['HTTP_USER_AGENT'];// Считываем название браузера
if (stristr($br,"Opera")) header("Location: http://site.com/opera");// Opera
elseif (stristr($br,"MSIE")) header("Location: http://site.com/ie");// Internet Explorer
elseif (stristr($br,"Firefox")) header("Location: http://site.com/firefox");// Firefox
else header("Location: http://site.com/ie");
---------
Этот мир обречён на нас
©Сергей Маврин
Ответ отправил: Stamm (статус: Практикант)
Ответ отправлен: 26.08.2006, 21:37
Оценка за ответ: 5
Комментарий оценки:
Спасибо! Оригинальный скрипт!

Отвечает: Евгений Крюков
Здравствуйте, Angel7!
Вариант первый , он же единственно правильный - делайте дизайн так, чтобы он смотрелся одинаково во всех браузерах. Есть стандарты и если Вы их выдерживаете, то всё остальное - проблемы браузерописателей. Ведь завтра могут выйти другие браузеры, так что, под каждый отдельную версию делать. Есть сайт http://validator.w3.org/ , на котором можно проверить свой код на соответствие стандартам.
Вариант второй, на случай, если Вы упорствуйте в своих заблуждениях -
см. приложение. Данная функция возвращает массив, в котором указана версия и название браузера. После этого в главной странице делаете выбор типа
$browser =chbr()
switch ($browser[0]):

case 'MSIE':
include_once('скрипт_под_IE');
break;
case 'Mozilla' :
include_once('скрипт_под_Мозиллу');
break;
default:
include_once('скрипт_по_умолчанию');
endswitch;
Более подробно можно посмотреть здесь:
http://forum.dklab.ru/php/advises/OpredelenieBrauzeraEgoVersiiIOsKlienta.html

Приложение:

---------
Большинство ответов на вопросы в рассылках находиться через Яндекс за 1 мин.

Ответ отправил: Евгений Крюков (статус: Студент)
Ответ отправлен: 26.08.2006, 21:55
Оценка за ответ: 4
Комментарий оценки:
К сожалению, первый вариант мне не подходит...


Вопрос № 53.378
Уважаемые эксперты? помогите в такой проблеме. Есть база данных с именами и датами рождения пользователей (поля, допустим, name, b_day, b_month, b_year). Каким образом можно сделать, чтобы каждый день на главной странице отображалось, у кого из пользователей сегодня день рождения? с помощью функции timestamp не получается из-за того, что в поле b_month месяцы даны в русском варианте (января, февраля и т.п.), а не в английском, как того требует timestamp. Если можно, приведите пример кода для решения данной проблемы. спасибо.
Отправлен: 26.08.2006, 21:47
Вопрос задал: Newcomer (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Stamm
Здравствуйте, Newcomer!
#Создаём массив с названиями месяцев на русском
$months=array('январь','февраль','март','апрель','май','июнь','июль','август','сентябрь','октябрь','ноябрь','декабрь');
#получаем текущую дату
$now=getdate();
$mon=$months[$now['mon']-1];
$day=$now['mday'];
$year=$now['year'];
#Делаем запрос:
mysql_query("SELECT * FROM table WHERE b_month='$mon' AND b_day='$day' AND b_year='$year'");
---------
Этот мир обречён на нас
©Сергей Маврин
Ответ отправил: Stamm (статус: Практикант)
Ответ отправлен: 26.08.2006, 22:03

Отвечает: Евгений Крюков
Здравствуйте, Newcomer!
Как правильно - конвертнуть базу в правильный формат и не париться, здесь налицо ошибка проектирования БД. Если это по некоторым причинам невозможно, то вот вариант (см. приложение). В скрипте использован класс DB

Приложение:

---------
Большинство ответов на вопросы в рассылках находиться через Яндекс за 1 мин.

Ответ отправил: Евгений Крюков (статус: Студент)
Ответ отправлен: 26.08.2006, 22:31


Вопрос № 53.410
Здравствуйте! В продолжения вопроса 52105, минифорум http://rusfaq.ru/info/Question/52105.

Как влияет на получение значения формы, если у этой формы есть имя. Например:
<form name="drive" action = "http://localhost/action.php" method="get">.

У меня просто пишет:
array('hdd')
Это если получать данные $_POST('hdd'). И пишет:
hdd
если просто $hdd. Правда последний случай приходит в порядок при register_globals=on.
Но вот получить данные при register_globals=Of у меня не получилось.
А конструкция $_POST('hdd') или ;$_REQEST('hdd') еще не разу не дала вообще результатов.
В чем сдесь может быть дело?
Отправлен: 27.08.2006, 11:56
Вопрос задал: Артём Талипов (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Stamm
Здравствуйте, Артём Талипов!
Имя формы никак не влияет на получение значения формы. Дело в другом.
PHP регистрозависим в именах переменных. В предыдущем вопросе у вас имена были в верхнем регистре, значит в PHP нужно тоже указывать ключи массива в верхнем регистре:
$_REQUEST['HDD']
---------
Этот мир обречён на нас
©Сергей Маврин
Ответ отправил: Stamm (статус: Практикант)
Ответ отправлен: 27.08.2006, 12:10

Отвечает: Евгений Крюков
Здравствуйте, Артём Талипов!
Имя никак не влияет. Ваша ошибка в том, что в форме у Вас стоит метод GET, соответственно, все данные формы находятся в глобальном массиве $_GET. Измените метод на POST и тогда все данные будут в $_POST. Есть также общий глобальным массив $_REQUEST, в котором данные из $_GET и $_POST. А про register_globals=on забудьте, в корне неправильный подход, который уже убрали из PHP5
---------
Большинство ответов на вопросы в рассылках находиться через Яндекс за 1 мин.
Ответ отправил: Евгений Крюков (статус: Студент)
Ответ отправлен: 27.08.2006, 12:10

Отвечает: Цепковский Антон Сергеевич
Здравствуйте, Артём Талипов!

Попробуйте вместо $_POST('hdd') так: $_POST['hdd'], ведь $_POST - это массив.

С уважением,
Антон Цепковский
---------
Вся наша жизнь - RPG
Ответ отправил: Цепковский Антон Сергеевич (статус: 3-ий класс)
Ответ отправлен: 27.08.2006, 14:11

Отвечает: Козлов Алексей Сергеевич
Здравствуйте, Артём Талипов!
У вас ошибка в использовании скобок, т.е. вместо () надо использовать []:
Замените $_GET('text1') на $_GET['text1'].
А еще лучше на $_REQUEST['text1']. Ну и само-собой используйте переменные в одинаковом регистре.
---------
Вы доставили мне истинное удовольствие парни, взвалив на меня Ваши проблемы (М. Фрай).
Ответ отправил: Козлов Алексей Сергеевич (статус: 6-ой класс)
Ответ отправлен: 27.08.2006, 14:13


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.35 от 27.07.2006
Яндекс Rambler's Top100

В избранное