|
|
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
Есть на моем интранет-сервере голосовалка “Рейтинг пива”. Крутится сия штука на ActivePerl+MS SQL+(WebSite 1.0 от O’Relly), через DBI (ADO). Короче, все стандартно до скуки. Каждый желающий может внести в него новый сорт и поставить оценку любой марке из списка. Имеются поля ID int identity Name char Hit int default 0 Balls decimal default 0 Занесение нового сорта – Insert into beer (Name) valuе (@name’) Выставление оценки. Для голосования из формы передается оценка @ball=(от -2 до +2) и @ID марки. Update beer Set balls=(balls*hit+@ball)/(hit+1), Hit=hit+1 Where ID=@ID До чего скучно все это излагать. Как будто букварь переписываю. А теперь – страшное. Прихожу я из отпуска, и обнаруживаю, что у одной марки поле balls = NULL Причем я точно помню, что в этом поле первоначально было число (пиво - Балтика 7) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 21:19:14 |
|
||
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
Ворзможно, был передан параметр @ball = NULL... Проверь структуру таблицы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 21:26:53 |
|
||
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
Думаю Сергей Тихонов прав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 21:30:59 |
|
||
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
Это Perl. Он интерпретирует пустые значения переменных как 0 или ‘’, в зависимости от контекста. Запрос собирается из строки $sql=’Update beer Set balls=(balls*hit+’.$ball.’)/(hit+1), Hit=hit+1 Where ID=’.$ID; Если переменная $ball не определена, то я бы получил Update beer Set balls=(balls*hit+)/(hit+1), Hit=hit+1 Where ID=100; Вылетела бы ошибка, транзакция бы не проскочила, и все бы было путем. Не думаете же вы, что строка собралась в таком виде: Update beer Set balls=(balls*hit+NULL)/(hit+1), Hit=hit+1 Where ID=100; Предположим, что я нифига не понимаю в перле, и он действительно присвоил $ball строковое значение ‘NULL’. И как ему тогда удалось присвоить ID из реального диапазона? А если бы ID был не из диапазона, или не определен, то то же проблем бы не было. Да, все крутиться под виндами, и ActivePerl не равен pure Perl. Но не до такой же степени? Хорошо, все сваливаем на веб-сервер. Он изловчлся передать ID, а на ball заткнулся, и решил вместо действительного значения передать строку ‘NULL’. Но я ни разу не слышал, что бы так глюканулся продукт от O’Relly. И у меня за 5 лет проблем с ним не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2002, 23:14:53 |
|
||
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
Просто нашелся умелец, который сумел пропихнуть "NULL" строку как value группы радиокнопок. Или "левый" браузер какой-нить "подсуетился". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2002, 15:19:22 |
|
||
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
Ага. Он сидел в засаде за процессором, с полным мешком нулов, и в нужный момент заменил пустую строку на 'NULL'. Передача параметров от формы на перл выполняется методом POST, так что никто некоректную строку вручную запустить не мог. Я точно знаю, с каких броузеров ко мне лазят: IE 3-6, Netscape 5-6, Operа 5.3 -6, Mozilla 0-1. Я все-таки думаю, что я влетел-таки в 0.00001% возможного сбоя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2002, 17:24:46 |
|
||
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
Объясняю. Умелец пишет свой html с правильными именами инпутов (как у тебя) Типа: <form name="fm" method="post" action="АДРЕС_ТВОЕЙ_ЦЕЛЕВОЙ_ПАГИ"> <input type="radio" name="r" value="0"> <input type="radio" name="r" value="NULL"> <input type="submit"> И запускает её на своём PWS (IIS) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2002, 20:52:06 |
|
||
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
Сорри за последнюю строчку в моем постинге. Сказались мои личные малоинтересные причуды в веб-строительстве. В нашем случае это, конечно, смысла не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2002, 21:21:59 |
|
||
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
Пример. Есть на америкосском сайте голосовалка в виде радиокнопок. Беру из "В виде HTML" текст их паги. Сохраняю у себя как html файл. Вношу поправки: одной из радиокнопок ставлю value="NULL", в action формы прописываю полный путь. Естественно, у формы method="post". Открываю эту пагу и голосую за "NULL". Получаю ответ: Код: plaintext 1. 2. 3. 4. 5. 6. Конечно, если бы NULL значения допускались (как у Кота2), то мой бы NULL туда попал. Хотя, как я прикинул, там тоже нет проверки на вхождение "значений" радиокнопок в правильный диапазон. Т.е. вполне можно инсертить "дурные" ChoiceID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2002, 02:05:46 |
|
||
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
Скорее всего ты прав. Сегодня проверю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2002, 07:16:55 |
|
||
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
2Cat2 "Ихняя" и твоя "пивная" голосовалки - это, конечно, чепуха. А представь какой-нить важный сбор данных: писец тады наступает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2002, 12:11:49 |
|
||
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
Зацените, какую я себе выбрал страну (в моём профиле). В списке её, конечно, нет. New Country ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2002, 13:23:21 |
|
||
|
Страшная история
|
|||
|---|---|---|---|
|
#18+
Да. Все подтвердилось. Это самый вероятный вариант. Вставил проверку на корректные варианты. Только вот не понятно, чем вредителю Балтика 7 не угодила? ===== Приношу свои извинения MS SQL, которого я напрсно обвинял а глюках ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2002, 19:27:04 |
|
||
|
|

start [/forum/topic.php?fid=46&gotonew=1&tid=1819792]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
10ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 239ms |
| total: | 418ms |

| 0 / 0 |
