Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Пожалуйста, помогите защитить скрипт  (Прочитано 6963 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vetlblya
Гость
« : 05-06-2010 19:17 » 

Люди добрые, написал скрипт авторизации, но пока не закидываю на хостинг - опасаюсь за безопасность. Прочитал несколько статей о безопасном cgi-программировании, но так ничего толком и не понял. Объясните на примере моего скрипта его слабые стороны, способы защиты и взлома (для того что бы понимать от чего защищаться)

Код:
#!/usr/bin/perl -wTI /home/../cgi-bin/config
use CGI qw(:standard);
use CGI::Session( '-ip_match' );
use CGI::Session::Driver::mysql;
use strict;
use DBI;
use CGI::Cookie;
use myconfig;


if ((param('id')=~ (/^[0-9]+$/)) and (length(param('id'))<10))#проверяю код на содержание только цифер
{
if ((param('pass')=~ (/^[a-zA-Z0-9]+$/)) and (length(param('pass'))<13))#проверяю пароль на содержание только цифер и латинских символов
{

my $id=param('id');
my $pass = param('pass');

my ($dbh,$rv, $st, @row);

$dbh = DBI->connect("dbi:mysql:database=$myconfig::db:host=$myconfig::host", $myconfig::us, $myconfig::pass)or   print"err01";#коннект к базе на локалхосте хостинга

$st = $dbh->prepare("select mail from user where id=$id and pass=$pass;");/проверяю наличие пользователя в базе
$st->execute()or  print"err08";
@row=$st->fetchrow_array;

my $sid=undef;

if ($row[0]eq '')#если пользователя нет на всяк случай (не знаю на какой) стираю ему кук
{
my $coo = new CGI::Cookie(-name=>'session', -value=>undef);
print header(-charset=>'Windows-1251',-cookie=>$coo);
print"err07";
exit;
}
    else#если пользователь найден в бд открываю ему сессию: создаю запись в бд сессий и отправляю кук с идентификатором сессии
{
my $dbh_sess = DBI->connect("dbi:mysql:database=$myconfig::db_s:host=$myconfig::host_s", $myconfig::us_s, $myconfig::pass_s)or print"err19";
 
my $session = CGI::Session->new('driver:mysql', $sid, { 'Handle' => $dbh_sess });

$st = $dbh->prepare('select l0, l1, l2 from user where id='.$id.';');#выбираю кой-какие данные
$st->execute()or print"err08";
@row=$st->fetchrow_array;

my $cookie = new CGI::Cookie(-name=>'session',-value=>$session->id() ,-expires => '+1h');
print header(-cookie=>$cookie)or print"err16";

print 'l0'.$row[0].'l1'.$row[1].'l2';

}
}
else #иф с паролем
{
print "Content-Type:text/html\n\n";
print"err04";
}
}
else # иф с кодом
{
print "Content-Type:text/html\n\n";
print"err09";
}
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 09-06-2010 18:32 » 

vetl, для начала научись форматировать код — очень плохо читается.

Что твоя программа делает? Как она должна работать и как не должна?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #2 : 10-06-2010 06:25 » 

vetl, в общем-то код написан, хоть и некрасиво, но работать может. Я бы, вот, пожалуй, строковые параметры в sql-запросах заключал в кавычки...
 Как могут взламывать? Да хоть брутфорсом! Запоминай IP хоста и при 3-й или 5-й ошибке логина с него в течение 5 минут - блокируй, скажем, на сутки - не принимай с него вообще ничего..
 Если уж делаешь проверку логин/пароль на цифры-буквы (молодец, шансы sql injection немного понизил), то проверяй еще и на длину. При желании можно послать длииинный параметр и база выдаст ошибку - а зачем она тебе?
Еще учти что взлому может поддаваться Cookie. Ты пишешь туда просто ID сессии? Слишком просто. Пиши туда хэш. Хоть от той же сессии. Или пиши три параметра - userid, сесию и хэш от них - так ты сможешь проверить целостность при получении.

Насчет слабочитаемости кода - комментарии есть - и уже хорошо.. Читается плохо, это да, но это проблема 95% всех Perl/PHP скриптов. Я пишу на PHP и знаю, что в таких языках трудно организовать нормальную структуру.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 10-06-2010 09:03 » new

Насчет слабочитаемости кода - комментарии есть - и уже хорошо.. Читается плохо, это да, но это проблема 95% всех Perl/PHP скриптов. Я пишу на PHP и знаю, что в таких языках трудно организовать нормальную структуру.

Выравнивать код и не слеплять идентификаторы и операторы (особенно буквенные операторы!) - это разве в скриптовых языках сложно?

Я не ощущаю никаких сложностей в форматировании обоих упомянутых языков, а равно и написании читаемого кода. Они ничуть не менее гибкие по синтаксису и выразительности, чем тот же C++.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines