[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Задача на корректную обработку данных
twin
Решив эту несложную задачку, Вы раз и на всегда покончите с сомнениями на счет SQL-инъекций и правильного отображения данных.

Задача.
Написать скрипт регистрации. Он должен:
1. Сохранять в базе MySQL имя, полученное из формы методом POST
2. Выводить список всех зарегистрировавшихся пользователей в обратном порядке, последнего зарегистрировавшегося на первом месте.
3. Имена в списке должны быть представлены в виде ссылок, при нажатии на которую должна появится дата регистрации.
4. Иметь поисковик, который должен осуществлять поиск по полю с именами и выводить все имеющиеся совпадения (по части слова).

Требования.
1. В имени могут присутствовать абсолютно любые символы, включая пробел. Исключением является только пробел в чистом виде, без других символов.
2. Имя должно выводиться в браузер без искажений.
3. При осуществлении поиска слово, набранное в поле, должно возвращаться обратно в форму.
4. Форма поиска должна отправляться методом GET
5. Скрипт не должен зависеть от настройки magic_quotes.

Безопасность
1. Скрипт должен быть защищен от SQL-инъекций
2. Должна быть защита от F5
3. Страница должна быть защищена от XSS атак.

Кроме того важны оптимальность, читабельность и стиль написания.

Формат базы данных:
CREATE DATABASE `names`;

CREATE TABLE `names` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`date` TIMESTAMP NOT NULL ,
`name` VARCHAR( 250 ) NOT NULL ,
PRIMARY KEY ( `id` )
);


Имена для проверки:
O'Relly
Mc''donalds
volt&
I 100% know
Guest004
<Jensen & partners>
2*2=5?
\ bacslashes \
-=++++
%%%%
_____


PS. Если Вы хотите понять раз и на всегда основы клиент-серверных взаимодействий, забудьте такие слова как некогда, неохота, я лучше спрошу и дождусь готового решения. Решив эту задачу один раз Вы больше не станете задавать несуразных вопросов и сможете спать спокойно. Не опасаясь за безопасность своих скриптов.

Ответы можно выкладывать в отдельные темы, где будет произведен детальный разбор полетов.



Ответы на задачу:





Спустя 5 месяцев, 17 дней, 4 часа, 16 минут, 27 секунд (24.12.2009 - 23:40) VolCh написал(а):
<!--begin268900begin-->
Цитата
1. В имени могут присутствовать абсолютно любые символы, включая пробел. Исключением является только пробел в чистом виде, без других символов.


Ведущие и конечные пробелы являются допустимыми? <!--end268900end-->

Спустя 27 минут, 40 секунд (25.12.2009 - 00:08) VolCh написал(а):
<!--begin268932begin-->
Цитата
Формат базы данных:

<pre class="sh_sourceCode" rel="sql"><span class="sh_keyword">CREATE DATABASE</span> <span class="sh_att">`names`</span><span class="sh_symbol">;</span>

<span class="sh_keyword">CREATE TABLE</span> <span class="sh_att">`names`</span> <span class="sh_symbol">(</span>
<span class="sh_att">`id`</span> <span class="sh_type">INT</span><span class="sh_symbol">(</span> <span class="sh_number">11</span> <span class="sh_symbol">)</span> <span class="sh_keyword">NOT NULL AUTO_INCREMENT</span> <span class="sh_symbol">,</span>
<span class="sh_att">`date`</span> <span class="sh_type">TIMESTAMP</span> <span class="sh_keyword">NOT NULL</span> <span class="sh_symbol">,</span>
<span class="sh_att">`name`</span> <span class="sh_type">VARCHAR</span><span class="sh_symbol">(</span> <span class="sh_number">250</span> <span class="sh_symbol">)</span> <span class="sh_keyword">NOT NULL</span> <span class="sh_symbol">,</span>
<span class="sh_keyword">PRIMARY KEY</span> <span class="sh_symbol">(</span> <span class="sh_att">`id`</span> <span class="sh_symbol">)</span> </pre>
);

- ошибка :)

Должно быть <pre class="sh_sourceCode" rel="sql"><span class="sh_keyword">CREATE DATABASE</span> <span class="sh_att">`names`</span><span class="sh_symbol">;</span>
<span class="sh_keyword">USE</span> <span class="sh_att">`names`</span><span class="sh_symbol">;</span>

<span class="sh_keyword">CREATE TABLE</span> <span class="sh_att">`names`</span> <span class="sh_symbol">(</span>
<span class="sh_att">`id`</span> <span class="sh_type">INT</span><span class="sh_symbol">(</span> <span class="sh_number">11</span> <span class="sh_symbol">)</span> <span class="sh_keyword">NOT NULL AUTO_INCREMENT</span> <span class="sh_symbol">,</span>
<span class="sh_att">`date`</span> <span class="sh_type">TIMESTAMP</span> <span class="sh_keyword">NOT NULL</span> <span class="sh_symbol">,</span>
<span class="sh_att">`name`</span> <span class="sh_type">VARCHAR</span><span class="sh_symbol">(</span> <span class="sh_number">250</span> <span class="sh_symbol">)</span> <span class="sh_keyword">NOT NULL</span> <span class="sh_symbol">,</span>
<span class="sh_keyword">PRIMARY KEY</span> <span class="sh_symbol">(</span> <span class="sh_att">`id`</span> <span class="sh_symbol">)
);</span></pre>
Иначе таблица создается в текущей БД, а не в names <!--end268932end-->

Спустя 2 часа, 2 минуты, 50 секунд (25.12.2009 - 02:10) twin написал(а):
<!--begin269006begin--> VolCh
Цитата
Ведущие и конечные пробелы являются допустимыми?

Это не суть важно, есть там trim() или нет. Это уже ближе к вопросу модерации, а не отображения. За таблицу спасибо. <!--end269006end-->

Спустя 1 месяц, 16 дней, 23 часа, 38 минут, 19 секунд (14.02.2010 - 01:49) qpayct написал(а):
<!--begin314944begin-->
Цитата (twin @ 25.12.2009 - 01:10)
VolCh
Цитата
Ведущие и конечные пробелы являются допустимыми?

Это не суть важно, есть там trim() или нет. Это уже ближе к вопросу модерации, а не отображения. За таблицу спасибо.

Логичней делать trim() до записи в базу - один раз, чем при каждом выводе из базы в последствии. Это избавит от проблемы некорректности поиска, которому для сравнения придется тоже делать trim(). Так что функцию очистки делаем до записи в базу и тем самым экономим ресурсы потом.
Я не увидел ни в одном решении задачи включая пример Твина ответа на вопрос, как правильно экранировать спец.символы(% и _) и еще так и не понял, почему обратный слэш возвращает в поиске %?
<!--end314944end-->

Спустя 5 месяцев, 22 дня, 22 часа, 45 минут, 44 секунды (6.08.2010 - 23:34) Guest написал(а):
<!--begin623508begin--> а как сделать так,чтобы когда обновляешь страницу старые данные не записывались в таблицу.
unset ($_POST['name']) что-то не помогает



Спустя 5 минут, 47 секунд Guest написал(а):
а в каком месте должна появиться дата регистрации?
на месте ссылки или на новой странице? <!--end623508end-->

Спустя 36 минут, 23 секунды (7.08.2010 - 00:11) twin написал(а):
<!--begin623534begin-->
Цитата
а как сделать так,чтобы когда обновляешь страницу старые данные не записывались в таблицу.
unset ($_POST['name']) что-то не помогает
это задача. :) Тут ответы можно искать только в решениях.
Цитата
а в каком месте должна появиться дата регистрации?
на месте ссылки или на новой странице?

А не важно. Лишь бы былО. И былО правильно. <!--end623534end-->

Спустя 1 месяц, 26 дней, 16 часов, 48 минут, 33 секунды (3.10.2010 - 16:59) Xpund написал(а):
<!--begin692772begin--> <pre class="sh_sourceCode" rel="php"><span class="sh_variable">$query</span> <span class="sh_symbol">=</span> <span class="sh_string">"SELECT name
FROM `names`
WHERE `name`='"</span><span class="sh_symbol">.</span><span class="sh_variable">$login</span><span class="sh_symbol">.</span><span class="sh_string">"'
"</span><span class="sh_symbol">;</span>
<span class="sh_variable">$row</span> <span class="sh_symbol">=</span> <span class="sh_function">mysql_query</span><span class="sh_symbol">(</span><span class="sh_variable">$query</span><span class="sh_symbol">)</span> <span class="sh_keyword">or</span> <span class="sh_function">die</span> <span class="sh_symbol">(</span><span class="sh_function">mysql_error</span><span class="sh_symbol">());</span>
<span class="sh_control">if</span> <span class="sh_symbol">(</span><span class="sh_function">mysql_num_rows</span><span class="sh_symbol">(</span><span class="sh_variable">$row</span><span class="sh_symbol">) ></span> <span class="sh_number">0</span><span class="sh_symbol">)</span>
<span class="sh_cbracket">{</span>
<span class="sh_function">echo</span> <span class="sh_string">"Takoi user imeetsya<br><hr>"</span><span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span></pre>
Такой зашиты от F5 хватит? <!--end692772end-->

Спустя 15 часов, 48 минут, 40 секунд (4.10.2010 - 08:48) Basili4 написал(а):
<!--begin693518begin--> Xpund
Такой защитой сервак нагнуть можно. <!--end693518end-->

Спустя 1 час, 41 минута, 20 секунд (4.10.2010 - 10:29) Xpund написал(а):
<!--begin693648begin--> Basili4
=) А по конкретнее? <!--end693648end-->

Спустя 9 минут, 52 секунды (4.10.2010 - 10:39) silius написал(а):
<!--begin693666begin-->
Цитата (Guest @ 6.08.2010 - 20:34)
а как сделать так,чтобы когда обновляешь страницу старые данные не записывались в таблицу.
unset ($_POST['name']) что-то не помогает


после сохранения данных в таблицу делать:
header("Location: ...");
<!--end693666end-->

Спустя 2 часа, 34 минуты, 30 секунд (4.10.2010 - 13:14) twin написал(а):
<!--begin693914begin--> Xpund
По конкретнее открой ветку и спроси. А лучше реши задачу.

Закрою от греха, чего тут оффтопите..
<!--end693914end-->


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.