База данных. Проверки?

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

vlanis
Сообщения: 11
Зарегистрирован: 19 фев 2004, 09:52
Контактная информация:

25 фев 2004, 09:22

Добрый день, господа!

Вот такой вот вопрос. Написал скрипт новостей, с администрированием, (perl, модуль CGI, mysql (DBI, DBD)), какие проверки стоит сделать при обращении к базе данных для записи новости в базу и для выборки, чтобы предусмотреть решение максимума возможных ошибок?
с уважением vlanis
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

25 фев 2004, 10:05

vlanis, максимум - это проверять синтаксис всех получившихся запросов самому :) .
Минимум - удалять(заменять) из пользовательского ввода все традиционно рекомендуемые к удалению символы и следить за тем, чтобы тебе вместо чисел и дат строки не подсовывали. Т.е. проверять совпадение типов данных.
vlanis
Сообщения: 11
Зарегистрирован: 19 фев 2004, 09:52
Контактная информация:

25 фев 2004, 10:34

AiK писал(а):vlanis, максимум - это проверять синтаксис всех получившихся запросов самому :) .
Минимум - удалять(заменять) из пользовательского ввода все традиционно рекомендуемые к удалению символы и следить за тем, чтобы тебе вместо чисел и дат строки не подсовывали. Т.е. проверять совпадение типов данных.
это что касается переменных. (кстати о традиционно рекомендуемых можно чуть поподробнее :) . А вот обращение к базе (connect) там не надо проверять наличие подключения?
с уважением vlanis
Yurich
Сообщения: 104
Зарегистрирован: 23 фев 2004, 19:07

25 фев 2004, 10:40

vlanis писал(а): это что касается переменных. (кстати о традиционно рекомендуемых можно чуть поподробнее :) . А вот обращение к базе (connect) там не надо проверять наличие подключения?
Конечно надо... а кто иначе это будет делать за тебя?! :D
Как проверять? Тоже все достаточно просто, большинство функций возвращают undef значение в случае ошибки, поэтому достаточно проверить переменную перед использованием на равенство undef
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

25 фев 2004, 10:43

(кстати о традиционно рекомендуемых можно чуть поподробнее :) .
пожалуйста: http://www.cert.org/tech_tips/malicious ... ation.html
там не надо проверять наличие подключения
надо. И резалтсет на непустоту. И диапазон вводимых значений. В некоторых случаях и количество строк в резалтсете.
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

25 фев 2004, 11:22

Если параметр в запросе имеет ограниченное количество значений, то удобно пропустить значение параметра через хеш. Например:
кусок в строке запроса ... &rubrika=sport& ...
В программе:

my %rubriks = qw (sport 1 politika 2 business 3 family 4);
if ($rubriks{$rubrika_value}) { // допустимое значение
....
else { // какая-то шняга
....
}

Это позволяет одновременно проверять допустимость значения и, если нужно, подставлять нужное для SQL-запроса значение.
vlanis
Сообщения: 11
Зарегистрирован: 19 фев 2004, 09:52
Контактная информация:

25 фев 2004, 12:00

&quot писал(а):
(кстати о традиционно рекомендуемых можно чуть поподробнее :) .
sub val{
my ($value)=@_;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s///g;
$value =~ s/>/>/g; #замены скобок <
$value =~ s/</</g;
$value =~ s/([^\b\s,.]{20})([^\s\b,.])/$1 $2/sig; #проверка на длинное слово, и разбиение его для переноса
$value=~tr/\r\n/ /; #замена переводов строки на пробелы
return $value;
}

Первые три на вскидку не помню. Кто дополнит ф-цию валидации? ;)
с уважением vlanis
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

25 фев 2004, 12:04

vlanis, по ссылке, что я тебе привёл, есть пример на Perl.
vlanis
Сообщения: 11
Зарегистрирован: 19 фев 2004, 09:52
Контактная информация:

25 фев 2004, 12:28

AiK писал(а):vlanis, по ссылке, что я тебе привёл, есть пример на Perl.
Кстати пока я смотрю вопрос оффтопик: нужно передать через адресную строку браузера символ &. как это сделать ведь он служит разделителем параметров?
с уважением vlanis
vlanis
Сообщения: 11
Зарегистрирован: 19 фев 2004, 09:52
Контактная информация:

25 фев 2004, 12:34

AiK писал(а):vlanis, по ссылке, что я тебе привёл, есть пример на Perl.
sub val{
my ($value)=@_][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/A-Za-z0-9\ //dc;
$value =~ s///g;
$value =~ s/[\"\'\%\;\)\(\&\+]//g;
$value =~ s/>/>/g;
$value =~ s/</</g;
$value =~ s/([^\b\s,.]{20})([^\s\b,.])/$1 $2/sig;
$value=~tr/\r\n/ /;
return $value;
}

ну чтоже - наша функция растет не по дням а по часам!!!
с уважением vlanis
Ответить