PDA

Просмотр полной версии : База данных. Проверки?



vlanis
25.02.2004, 09:22
Добрый день, господа!

Вот такой вот вопрос. Написал скрипт новостей, с администрированием, (perl, модуль CGI, mysql (DBI, DBD)), какие проверки стоит сделать при обращении к базе данных для записи новости в базу и для выборки, чтобы предусмотреть решение максимума возможных ошибок?

AiK
25.02.2004, 10:05
vlanis, максимум - это проверять синтаксис всех получившихся запросов самому :).
Минимум - удалять(заменять) из пользовательского ввода все традиционно рекомендуемые к удалению символы и следить за тем, чтобы тебе вместо чисел и дат строки не подсовывали. Т.е. проверять совпадение типов данных.

vlanis
25.02.2004, 10:34
vlanis, максимум - это проверять синтаксис всех получившихся запросов самому :).
Минимум - удалять(заменять) из пользовательского ввода все традиционно рекомендуемые к удалению символы и следить за тем, чтобы тебе вместо чисел и дат строки не подсовывали. Т.е. проверять совпадение типов данных.

это что касается переменных. (кстати о традиционно рекомендуемых можно чуть поподробнее:). А вот обращение к базе (connect) там не надо проверять наличие подключения?

Yurich
25.02.2004, 10:40
это что касается переменных. (кстати о традиционно рекомендуемых можно чуть поподробнее:). А вот обращение к базе (connect) там не надо проверять наличие подключения?

Конечно надо... а кто иначе это будет делать за тебя?! :D
Как проверять? Тоже все достаточно просто, большинство функций возвращают undef значение в случае ошибки, поэтому достаточно проверить переменную перед использованием на равенство undef

AiK
25.02.2004, 10:43
(кстати о традиционно рекомендуемых можно чуть поподробнее:).
пожалуйста: http://www.cert.org/tech_tips/malicious_code_mitigation.html


там не надо проверять наличие подключения
надо. И резалтсет на непустоту. И диапазон вводимых значений. В некоторых случаях и количество строк в резалтсете.

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

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

Это позволяет одновременно проверять допустимость значения и, если нужно, подставлять нужное для SQL-запроса значение.

vlanis
25.02.2004, 12:00
[quote](кстати о традиционно рекомендуемых можно чуть поподробнее:).

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/>/&gt;/g; #замены скобок <
$value =~ s/</&lt;/g;
$value =~ s/([^\b\s,.]{20})([^\s\b,.])/$1 $2/sig; #проверка на длинное слово, и разбиение его для переноса
$value=~tr/\r\n/ /; #замена переводов строки на пробелы
return $value;
}

Первые три на вскидку не помню. Кто дополнит ф-цию валидации? ;)

AiK
25.02.2004, 12:04
vlanis, по ссылке, что я тебе привёл, есть пример на Perl.

vlanis
25.02.2004, 12:28
vlanis, по ссылке, что я тебе привёл, есть пример на Perl.
Кстати пока я смотрю вопрос оффтопик: нужно передать через адресную строку браузера символ &. как это сделать ведь он служит разделителем параметров?

vlanis
25.02.2004, 12:34
vlanis, по ссылке, что я тебе привёл, есть пример на Perl.

sub val{
my ($value)=@_;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/A-Za-z0-9\ //dc;
$value =~ s///g;
$value =~ s/[\"\'\%\;\)\(\&\+]//g;
$value =~ s/>/&gt;/g;
$value =~ s/</&lt;/g;
$value =~ s/([^\b\s,.]{20})([^\s\b,.])/$1 $2/sig;
$value=~tr/\r\n/ /;
return $value;
}

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

AiK
25.02.2004, 12:38
vlanis, ты открытым текстом можешь передавать только alphanumeric. Всё остальное - в виде %hh. Unicode правда четырмя символами кодироваться может. RFC2396, если не путаю.

Anonymous
02.03.2004, 16:42
Неплохо еще $param = $dbh->quote($param) делать перед инсертом в базу, да и при селектах не помешает в where.