Если я не ошибаюсь, то исходный скрипт можно взломать.
Поясняю:
Допустим, я знаю, что в системе зарегистрирован пользователь Vasya. Я запускаю локальный сервер, устанавливаю в браузере для нужного сайта следующие Cookies:
login=Vasya\' OR (login=\'lalala
sess=\') OR login=\'lalala
Далее я выключаю локальный сервер и захожу на реальный.
В результате запустится функция sess(), которая выполнит следующий запрос:
select id,status,sess from TABLE_NAME WHERE login = \'Vasya\' OR (login=\'lalala\' and sess = \'\') OR login=\'lalala\'
В результате скрипт признает меня Васей, хотя я на самом деле не Вася. Вот так то.
Решения:
1) Нужно проверять все значения, полученные от пользователя, в том числе Cookies. Если известно, что имя состоит из букв, цифр и \'_\', а номер сессии - только из цифр, то следует добавить:
$login=~s/\\W//g;
$sess=~s/\\D//g;
2) Вместо $sth = $dbh->prepare("select id,status,sess from $users_table WHERE login = \'$login\' and sess = \'$sess\'");
$sth->execute || die $dbh->errstr;
используй $sth = $dbh->prepare("select id,status,sess from $users_table WHERE login = ? and sess = ?");
$sth->execute($login, $sess) || die $dbh->errstr;
Поможет даже без пункта 1
3) Думай как хакер. Врага нужно знать.
2ALL: Есть повод задуматься над собственными скриптами.