База данных. Проверки?
Добрый день, господа!
Вот такой вот вопрос. Написал скрипт новостей, с администрированием, (perl, модуль CGI, mysql (DBI, DBD)), какие проверки стоит сделать при обращении к базе данных для записи новости в базу и для выборки, чтобы предусмотреть решение максимума возможных ошибок?
Вот такой вот вопрос. Написал скрипт новостей, с администрированием, (perl, модуль CGI, mysql (DBI, DBD)), какие проверки стоит сделать при обращении к базе данных для записи новости в базу и для выборки, чтобы предусмотреть решение максимума возможных ошибок?
с уважением vlanis
vlanis, максимум - это проверять синтаксис всех получившихся запросов самому
.
Минимум - удалять(заменять) из пользовательского ввода все традиционно рекомендуемые к удалению символы и следить за тем, чтобы тебе вместо чисел и дат строки не подсовывали. Т.е. проверять совпадение типов данных.

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

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

Как проверять? Тоже все достаточно просто, большинство функций возвращают undef значение в случае ошибки, поэтому достаточно проверить переменную перед использованием на равенство undef
пожалуйста: http://www.cert.org/tech_tips/malicious ... ation.html(кстати о традиционно рекомендуемых можно чуть поподробнее.
надо. И резалтсет на непустоту. И диапазон вводимых значений. В некоторых случаях и количество строк в резалтсете.там не надо проверять наличие подключения
Если параметр в запросе имеет ограниченное количество значений, то удобно пропустить значение параметра через хеш. Например:
кусок в строке запроса ... &rubrika=sport& ...
В программе:
my %rubriks = qw (sport 1 politika 2 business 3 family 4);
if ($rubriks{$rubrika_value}) { // допустимое значение
....
else { // какая-то шняга
....
}
Это позволяет одновременно проверять допустимость значения и, если нужно, подставлять нужное для SQL-запроса значение.
кусок в строке запроса ... &rubrika=sport& ...
В программе:
my %rubriks = qw (sport 1 politika 2 business 3 family 4);
if ($rubriks{$rubrika_value}) { // допустимое значение
....
else { // какая-то шняга
....
}
Это позволяет одновременно проверять допустимость значения и, если нужно, подставлять нужное для SQL-запроса значение.
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
vlanis, по ссылке, что я тебе привёл, есть пример на Perl.
Кстати пока я смотрю вопрос оффтопик: нужно передать через адресную строку браузера символ &. как это сделать ведь он служит разделителем параметров?AiK писал(а):vlanis, по ссылке, что я тебе привёл, есть пример на Perl.
с уважением vlanis
sub val{AiK писал(а):vlanis, по ссылке, что я тебе привёл, есть пример на Perl.
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