Старый 07.12.2005, 13:14   #1   
Форумец
 
Сообщений: 28
Регистрация: 12.10.2005
Возраст: 40

fuhrer вне форума Не в сети
вопрос по php

Как, в случае ввода пользователем в текстовое поле типа <input type =text> всего чего угодно, только не какого-то числа, выводилось сообщение об ошибке и ничего далее не делалось, т. е. чтобы в поле можно было ввести только число.
  Ответить с цитированием
Старый 07.12.2005, 14:09   #2   
фотограф
 
Аватар для ilyaerin
 
Сообщений: 2,738
Регистрация: 20.10.2004

ilyaerin вне форума Не в сети
fuhrer
это не php а javascript...

з.ы. проверяем, что введено...
1. число - ничего не далаем
2. не число - выводим сообщение об ошибке
  Ответить с цитированием
Старый 07.12.2005, 14:11   #3   
Форумец
 
Аватар для Ray79
 
Сообщений: 831
Регистрация: 04.08.2005

Ray79 вне форума Не в сети
Перед отправкой данных с формы делать проверку строки инпута.
  Ответить с цитированием
Старый 07.12.2005, 14:13   #4   
Форумец
 
Аватар для Ray79
 
Сообщений: 831
Регистрация: 04.08.2005

Ray79 вне форума Не в сети
to loshadka Эх, раньше меня запостил
  Ответить с цитированием
Старый 07.12.2005, 14:18   #5   
фотограф
 
Аватар для ilyaerin
 
Сообщений: 2,738
Регистрация: 20.10.2004

ilyaerin вне форума Не в сети
Ray79
  Ответить с цитированием
Старый 07.12.2005, 14:21   #6   
Registered User
 
Аватар для netwind
 
Сообщений: 1,905
Регистрация: 25.03.2003

netwind вне форума Не в сети
а кто помешает пользователю отправить нечисло и похакать всенасвете?

в php на сервере тоже нужно проверять переменные.
хотя бы так :
$num=(int)$num;
  Ответить с цитированием
Старый 07.12.2005, 14:28   #7   
фотограф
 
Аватар для ilyaerin
 
Сообщений: 2,738
Регистрация: 20.10.2004

ilyaerin вне форума Не в сети
netwind учимя читать вопрос...
  Ответить с цитированием
Старый 07.12.2005, 14:46   #8   
Форумец
 
Сообщений: 28
Регистрация: 12.10.2005
Возраст: 40

fuhrer вне форума Не в сети
Цитата:
это не php а javascript...
Как так не php, прог уже почти готов и я думал (во всяком случае надеялся), что пишу его на php.
  Ответить с цитированием
Старый 07.12.2005, 14:47   #9   
Registered User
 
Аватар для netwind
 
Сообщений: 1,905
Регистрация: 25.03.2003

netwind вне форума Не в сети
fuhrer
ты пишешь никому ненужный курсовик или реальное приложение для интернета?
это число потом участвует в дальшейших запросах к БД, вычислениях или программной логике?

хотелось бы чтобы программисты понимали, что яваскрипт спасет от неаккуратного ввода, но не от злонамеренного хакера.
  Ответить с цитированием
Старый 07.12.2005, 15:00   #10   
Форумец
 
Сообщений: 28
Регистрация: 12.10.2005
Возраст: 40

fuhrer вне форума Не в сети
Цитата:
это число потом участвует в дальшейших запросах к БД, вычислениях или программной логике
Это число должно занестись в мускуловскую базу в поле, которое имеет тип BIGINT(15).
  Ответить с цитированием
Старый 07.12.2005, 15:14   #11   
фотограф
 
Аватар для ilyaerin
 
Сообщений: 2,738
Регистрация: 20.10.2004

ilyaerin вне форума Не в сети
fuhrer
тогда перед занесением его в базу нужно сделать проверку, вот тут как раз php, http://php.net/is_int/
  Ответить с цитированием
Старый 07.12.2005, 15:17   #12   
Registered User
 
Аватар для netwind
 
Сообщений: 1,905
Регистрация: 25.03.2003

netwind вне форума Не в сети
ну вот, если не перепроверить значение и в php - получишь типичную ошибку SQL-injection. об это много понаписано.

fuhrer товарыщи тоже дело говорят:
обычно делают проверку данных на javascript на клиентской стороне, еще до отсылки на сервер, чтобы пользователю по 10 раз не запрашивать страничку.
Но и проверками на стороне php пренебрегать не следует.
Злонамеренный пользователь может отключить жаваскрипт и запихать тебе в базу
данных каких захочет.

простая строчка
$num=(int)$num;
гарантирует что у тебя в переменной будет число (или 0, что не так уж плохо)
loshadka
учимся не только читать, но и анализировать вопрос ).
  Ответить с цитированием
Старый 07.12.2005, 15:42   #13   
Форумец
 
Сообщений: 28
Регистрация: 12.10.2005
Возраст: 40

fuhrer вне форума Не в сети
loshadka
Большой Danke. Заработало...
  Ответить с цитированием
Старый 07.12.2005, 21:16   #14   
Форумец
 
Аватар для yujanin
 
Сообщений: 1,581
Регистрация: 11.04.2003

yujanin вне форума Не в сети
netwind, а (int)$num - это то же самое, что intval($num) ?

ну а для того, чтобы наверняка прекратить дальнейший вывод, есть функция die()
  Ответить с цитированием
Старый 07.12.2005, 22:01   #15   
error #65535
 
Аватар для maximn
 
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24

maximn вне форума Не в сети
Цитата:
Сообщение от yujanin
ну а для того, чтобы наверняка прекратить дальнейший вывод, есть функция die()
сам понял что сказал?
  Ответить с цитированием
Старый 07.12.2005, 22:30   #16   
Registered User
 
Аватар для netwind
 
Сообщений: 1,905
Регистрация: 25.03.2003

netwind вне форума Не в сети
yujanin ну да, практически то же самое, но приведение типов смотрится короче и благороднее.
maximn просто такова сложившая практика php,
ленивые программисты вместо обработки ошибок приводят типы и пихают везде die(), после обнаружения злонамеренных действий скрипты больше ничего не делают а просто мрут
  Ответить с цитированием
Старый 07.12.2005, 22:35   #17   
Форумец
 
Аватар для yujanin
 
Сообщений: 1,581
Регистрация: 11.04.2003

yujanin вне форума Не в сети
Цитата:
Сообщение от maximn
сам понял что сказал?
понял... функция die() останавливает php-процессор. так тебе понятнее?
  Ответить с цитированием
Старый 07.12.2005, 22:36   #18   
Форумец
 
Аватар для yujanin
 
Сообщений: 1,581
Регистрация: 11.04.2003

yujanin вне форума Не в сети
Цитата:
Сообщение от netwind
maximn просто такова сложившая практика php,
ленивые программисты вместо обработки ошибок приводят типы и пихают везде die(), после обнаружения злонамеренных действий скрипты больше ничего не делают а просто мрут
не обязательно. можно и обработку событий, ошибок сделать, и логи писать и всё что угодно. die() в конце просто останавливает скрипт - и это хорошая практика.
  Ответить с цитированием
Старый 08.12.2005, 00:02   #19   
error #65535
 
Аватар для maximn
 
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24

maximn вне форума Не в сети
Цитата:
Сообщение от yujanin
понял... функция die() останавливает php-процессор. так тебе понятнее?
зачем ему "прекращать дальнейший вывод"?

от чего ты его защитить решил?

$num = intval($_POST['num']);
mysql_query("UPDATE my_tbl SET num='".$num."' WHERE ...")
//и зачем вот тут die()!?

или такой вариант:

$num = intval($_POST['num']);
if (!$num) {
//а тут он зачем?
} else {
mysql_query("UPDATE my_tbl SET num='".$num."' WHERE ...")
}

или ты придумал новые типы инджекшена?

ЗЫ НЕЗАВИСИМО от того что прислал пользователь, скрипт НЕ должен аварийно и молча завершаться НИКОГДА
  Ответить с цитированием
Старый 08.12.2005, 10:01   #20   
Registered User
 
Аватар для netwind
 
Сообщений: 1,905
Регистрация: 25.03.2003

netwind вне форума Не в сети
страшно далеки вы от народа) расскажите почему не должен?
вот сейчас посчитал в vbulletin 26 раз die.

представь что ты пишешь небольшую модификацию незнакомого проекта,
и после твоего кода там могут быть еще какие-то вычисления с той же переменной.
die() гарантирует скрипт точно остановится и даже попытается в html вывести ошибку.
  Ответить с цитированием
Старый 08.12.2005, 13:15   #21   
error #65535
 
Аватар для maximn
 
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24

maximn вне форума Не в сети
будем считать что это мое имхо, каждый ****** по-своему..

если не сложно, сосчитай, сколько раз в vBulletin встречается 'at' и напиши сюда. я бы сам посчитал, но мне его качать нужно, а раз уж он у тебя стоит..

ЗЫ не написать мне своего vBulletin'a.. мечты разбиты вдребезги..
  Ответить с цитированием
Старый 08.12.2005, 13:18   #22   
фотограф
 
Аватар для ilyaerin
 
Сообщений: 2,738
Регистрация: 20.10.2004

ilyaerin вне форума Не в сети
netwind обработка ошибок должна быть корректной... а не просто die()...

должен быть нормальный и человекопонятный вывод сообщения...
  Ответить с цитированием
Старый 08.12.2005, 14:40   #23   
Registered User
 
Аватар для netwind
 
Сообщений: 1,905
Регистрация: 25.03.2003

netwind вне форума Не в сети
кто должен? кому? никому я не должен)

если все данные уже проверены в жавскрипте, то можно спокойно помирать, хакиров за людей не считаем)

maximn "at" это что вообще ?подавление ошибок @ ? - очень много, пальцев не хватит.

вообще в vbulletin есть более приличная обработка нефатальных ошибок: мылит на почту или в файл пишет.
как пойдет мылить ошибки админу, только успевай чистить.
кроме того своя система отладки.
это, скорее, исключение и общей массы движков.
  Ответить с цитированием
Старый 08.12.2005, 14:42   #24   
Registered User
 
Аватар для netwind
 
Сообщений: 1,905
Регистрация: 25.03.2003

netwind вне форума Не в сети
ну например :
if (!defined('THIS_SCRIPT') AND strpos(strtolower($script), 'global.php') !==
false)
{
die('<p><strong>Critical Error</strong><br />global.php must not be
called directly.</p>');
}


Ну в каком страшном сне юзер будет вызывать init.php ??
Die и все тут!
  Ответить с цитированием
Старый 08.12.2005, 15:46   #25   
error #65535
 
Аватар для maximn
 
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24

maximn вне форума Не в сети
Цитата:
Сообщение от netwind
ну например :
if (!defined('THIS_SCRIPT') AND strpos(strtolower($script), 'global.php') !==
false)
{
die('<p><strong>Critical Error</strong><br />global.php must not be
called directly.</p>');
}


Ну в каком страшном сне юзер будет вызывать init.php ??
Die и все тут!
да, это случай №2 когда использование die() необходимо. т.е. когда движок подгружает нужные модули в зависимости от раздела через require('chapter_1.php')

случай №1 когда без die() нельзя обойтись, это header+die

про 'at'ы (собаки) в vBulletin - самого думаю улыбнуло =)

зы всё имхо
  Ответить с цитированием
Старый 08.12.2005, 16:34   #26   
Registered User
 
Аватар для netwind
 
Сообщений: 1,905
Регистрация: 25.03.2003

netwind вне форума Не в сети
так я и не понял чем die тебе не угодил.
die это скорее sanity check, чем обработка ошибок пользователя и если все перечитать сначала, то применяется очень даже к месту.

в приведеном мною коде, ничего не мешает вывести ошибку красиво и тд.
просто вызов модуля прямо браузером - абсолютно ненормальный случай,
наверняка хакерский, возиться c этим случаем никто не хочет.
  Ответить с цитированием
Старый 08.12.2005, 18:43   #27   
Форумец
 
Аватар для yujanin
 
Сообщений: 1,581
Регистрация: 11.04.2003

yujanin вне форума Не в сети
Цитата:
Сообщение от loshadka
netwind обработка ошибок должна быть корректной... а не просто die()...

должен быть нормальный и человекопонятный вывод сообщения...
мы немного о разных вещах. die() - это не обработчик ошибок. это должна быть последняя строка в любом обработчике ошибок. это, как сказал netwind, sanity check, и просто хорошая практика. а на экран выводится wrapper какой уж хочешь. но задача программиста с точки зрения безопасности кода - убедиться, что вывод будет однозначно остановлен после выброса ошибки.
  Ответить с цитированием
Старый 08.12.2005, 19:06   #28   
Форумец
 
Аватар для yujanin
 
Сообщений: 1,581
Регистрация: 11.04.2003

yujanin вне форума Не в сети
Цитата:
Сообщение от maximn

$num = intval($_POST['num']);
mysql_query("UPDATE my_tbl SET num='".$num."' WHERE ...")

или такой вариант:

$num = intval($_POST['num']);
if (!$num) {
//а тут он зачем?
} else {
mysql_query("UPDATE my_tbl SET num='".$num."' WHERE ...")
}
во первых, intval("blabla"), например, будет равен 0 (а не NULL, как, судя по !$num, думаешь ты). откуда ты знаешь, что у тебя в таблице нет поля num = 0?. во-вторых, и в первом и во втором случае (из-за упомянутого выше нуля после intval) нужно ввести проверку на $num > 0. и если будет равно нулю, то нужно выбросить ошибку и остановить скрипт (с оформлением или без - это уже твоё решение). отчасти потому, что после [php]else {
mysql_query("UPDATE my_tbl SET num='".$num."' WHERE ...")
}[/php]

может идти ещё до хера стейтментов в скрипте. при этом у тебя продолжает идти вывод - но уже с одной неправильной переменной и с одним пропущенным sql-стейтментом. как это скажется в дальнейшем на исполнении скрипта (особенно, если скрипт большой) - одному богу известно. поэтому нельзя уповать на то, что в дальнейшем $num не пригодится или что и без этого UPDATE всё нормально прокатит - нельзя. нужно обработать ошибку.

Цитата:
ЗЫ НЕЗАВИСИМО от того что прислал пользователь, скрипт НЕ должен аварийно и молча завершаться НИКОГДА
так никто и не говорит, что молча и аварийно нужно. выкинуть ошибку на экран (можно даже хорошо оформленную), что мол так и так. а потом - сдохнуть. есть вещи, которые нормальный пользователь не введёт никогда (потому как нормальный пользователь бродит по ссылкам, а не будет менять значения в query string или в формах, подставляя всякие там ' и UNION) - и задача хорошего программиста, заботящегося о безопасности - пресекать такие попытки самыми строжайшими способами.
  Ответить с цитированием
Старый 08.12.2005, 22:22   #29   
error #65535
 
Аватар для maximn
 
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24

maximn вне форума Не в сети
Цитата:
Сообщение от yujanin
во первых, intval("blabla"), например, будет равен 0 (а не NULL, как, судя по !$num, думаешь ты). откуда ты знаешь, что у тебя в таблице нет поля num = 0?. во-вторых, и в первом и во втором случае (из-за упомянутого выше нуля после intval) нужно ввести проверку на $num > 0. и если будет равно нулю, то нужно выбросить ошибку и остановить скрипт (с оформлением или без - это уже твоё решение).
1. RTFM на тему оператора "!" И приведения типов. йа ару..
2. да мне пофиг есть там num=0 или нет, мы тут ввод пользователя проверяем, если ты не в курсе
2. $num > 0 - слов нет, это что? лирическое отступление автора?
Цитата:
Сообщение от yujanin
отчасти потому, что после [php]else {
mysql_query("UPDATE my_tbl SET num='".$num."' WHERE ...")
}[/php]

может идти ещё до хера стейтментов в скрипте. при этом у тебя продолжает идти вывод - но уже с одной неправильной переменной и с одним пропущенным sql-стейтментом. как это скажется в дальнейшем на исполнении скрипта (особенно, если скрипт большой) - одному богу известно. поэтому нельзя уповать на то, что в дальнейшем $num не пригодится или что и без этого UPDATE всё нормально прокатит - нельзя. нужно обработать ошибку.
уповать не надо, надо проверять, обрабатывать, но не die() офигивающему пользователю
Цитата:
Сообщение от yujanin
так никто и не говорит, что молча и аварийно нужно. выкинуть ошибку на экран (можно даже хорошо оформленную), что мол так и так. а потом - сдохнуть. есть вещи, которые нормальный пользователь не введёт никогда (потому как нормальный пользователь бродит по ссылкам, а не будет менять значения в query string или в формах, подставляя всякие там ' и UNION) - и задача хорошего программиста, заботящегося о безопасности - пресекать такие попытки самыми строжайшими способами.
никто не говорит? значит мне показалось, наверное
ты плохо знаешь пользователей, будут они и квоты и даблквоты пихать поверь.

пойми - от пользователя НЕ может прийти данных вызывающих ошибку. всё, точка. всё что пришло - это заебатые данные априори. это проблема программиста их проверять и обрабатывать. но если они пришли, то так и надо - этого хочет пользователь. и если он хочет искать по ' UNION .., значит ты ДОЛЖЕН искать по ' UNION ... Если он хочет логин ' or 1=1 , то у него ДОЛЖЕН быть именно такой логин.

Ошибок ввода не бывает, бывают ошибки их обработки.
  Ответить с цитированием
Старый 08.12.2005, 22:29   #30   
Форумец
 
Аватар для yujanin
 
Сообщений: 1,581
Регистрация: 11.04.2003

yujanin вне форума Не в сети
лол... ну ты и демагог.

покажи хоть один нормальный действующий проект на php, который ты написал... просто интересно.
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind