Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Переделать скрипт по register_globals off и сделать стандартную фильтрацию
 
 автор: zeta777   (27.11.2007 в 18:34)   письмо автору
 
 

Есть такой скрипт - Dating Agent 4.7.1 - нуленых версий полно в интернет. Так уже получилось, что мне нужен именно этот скрипт, хотя он и не особо функциональный. Вопрос такой - может ли кто-нибудь переделать этот скрипт, чтобы он работал с register_globals off и сделать в нем стандартную фильтрацию ввода и вывода данных. Есс-но за деньги. Или хотя бы переработать 6 файлов, а именно, фал register.php, search.php, manage_pictures.php, mem.php, agenda.php и messages.php. Там есть файлы tagster.php и mysql.lib, в которых прописаны функции в папке lib - только я не особо вижу, чтобы в сайте эти функции где-либо были задействованы. Я сама пыталась это сделать, но у меня ничего не выходит - вроде все делаю, проверяю скрипт на уязвимости сканнером (acunetix vulnerubility scanner) - и показывате тучу msq -injections. В общем сама я уже руки опустила, не могу понять, то ли я такая тупая, то ли этот сканнер просто придирается (что, впрочем тоже допустимо, так как я этим сканнером проверяла скрипты, которые предлагаются на php.su в качестве так сказать образцовых - и в них он тоже массу уязвимостей находит). В общем, если кто-то за это берется - оплачу работу с удовольствием.

   
 
 автор: mihdan   (28.11.2007 в 10:36)   письмо автору
 
   для: zeta777   (27.11.2007 в 18:34)
 


<?php
foreach($_REQUEST as $k=>$v)
{
 $
$k=$v;
}
?>


или даже так


<?php
function register_globals_array($array)
{
    foreach(
$array as $key => $value)
        if(
preg_match("/[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*/"$key))
            
$GLOBALS[$key] = $value;
}

function 
register_globals()
{
    
register_globals_array($_GET);
    
register_globals_array($_POST);
    
register_globals_array($_COOKIE);
    
register_globals_array($_ENV);
    
register_globals_array($_SERVER);
}
?>

   
 
 автор: zeta777   (29.11.2007 в 18:24)   письмо автору
 
   для: mihdan   (28.11.2007 в 10:36)
 

Спасибо. В общем и целом понятно :), а можно поподробнее, с комментариями?
Например, a-zA-Z_x7f-xff как фильтрует?

И еще, если это не слишком большая наглость. Можно привести примеры безопасных insert, select и upload, потому что вариантов предлагают много и в каждом кто-то находит недостатки, а хотелось бы все-таки понять, как именно фильтровать данные, чтобы спать спокойно

   
 
 автор: bronenos   (29.11.2007 в 18:36)   письмо автору
 
   для: zeta777   (29.11.2007 в 18:24)
 

upload? update!

   
 
 автор: zeta777   (29.11.2007 в 20:32)   письмо автору
 
   для: bronenos   (29.11.2007 в 18:36)
 

ну да, очепятка, update, конечно...

   
 
 автор: zeta777   (01.12.2007 в 18:15)   письмо автору
 
   для: zeta777   (29.11.2007 в 20:32)
 

Вот, стала делать сама. Вроде регистрацию, поиск, просморт анкеты и другие сделала, а вот файл авторизации никак не получается. Уже практически методом тыка начинаю все пробовать, но безрезультатно.

<?
require "../../settings.php";
$sval = "";
if($action == "submit")
{
$db = c();
$r = q("select id,status from members where login='$login' and pswd='$pswd'");
if(e($r)) $es = "Нет такого пользователя";
else
{
$ff = f($r);
switch($ff[status])
{
case 0:
$sval = "confirm";
break;
case 1:
setcookie("auth",$ff[id]);
setcookie("pass",$pswd);
q("update profiles set ldate='".strtotime(date("d M Y H:i:s"))."' where id='$ff[id]'");
d($db);
header("Location: center.php");
break;
case 2:
$sval = "contact";
break;
}
}
d($db);
}
include "../../_header.php";
include("menu.php");
if($sval == "")
{
?>
<form action="login.php?action=submit" method=post>
<? if($es!=""&&$action=="submit")echo "$es";?>
Логин <input type="text" name="login" value="<?php echo $username; ?>">
ПАРОЛЬ <input type="password" name="pswd" value="<?php echo $password; ?>">
<input type="submit" value="ВХОД"></form>
<?}
if($sval == "confirm"){echo "Вы не подтвердили регистрацию";}
if($sval == "contact"){echo "Ваш профайл дезактивирован";}
?>


Делаю:

$login=$_POST['login'];
$pswd=$_POST['pswd'];
$action=$_GET['action'];
if($_GET['action'] == "submit")
{
$db = c();
$r = q("select `id`, `status`, `login` from `members` where `login`='".view_format($_POST['login'])."' and `pswd`='".view_format($_POST['pswd'])."'");
if(e($r)) $es = "$l_login_wrong!";
else



и вот после else, где switch начинается - ничего не получается. Не могу передать значения.
Очень прошу помощи.

   
 
 автор: exp   (01.12.2007 в 19:38)   письмо автору
 
   для: zeta777   (01.12.2007 в 18:15)
 

<
<?
header
("Location: center.php");
break;

перенаправление на center.php при корректных вводимых данных происходит ?
в файле center.php принимаются переменные $_COOKIE['auth'], $_COOKIE['pass'] ?

и наверное как-раз тот случай когда select id,status from members where login='$login' and pswd='$pswd'" надо % и _ экранировать

   
 
 автор: zeta777   (01.12.2007 в 22:23)   письмо автору
 
   для: exp   (01.12.2007 в 19:38)
 

Я экранирую. Там есть функции, которые мне здесь же подсказали, просто я их не включила в код, так как мне главное выяснить как передать данные. В том-то и дело, что перенаправление на center.php никак не происходит :( и to что должно в update произойти тоже не происходит. Я вообще убирала перенаправление на center.php оставляла только update, но не работает. И делала вместо update и header просто echo "$ff[status]";- но данные не передаются. По-моему не определяется $sval. Может $sval нужно как-то с помощью глобльных переменных передавать? Хотя я и это пыталась делать. В общем застряла намертво на авторизации. на switch вообще никак не реагирует. Пыталась убрать switch и делать

if($ff[status]==0) header("Location: login.php?s=confirm");
elseif($ff[status]==2) header("Location: login.php?s=contact");
elseif($ff[status]==1)

а дальше

if ($_GET[s]=="confirm"){echo "регистрация не подтверждена";}
if ($_GET[s]=="contact"){echo "пользователь ".$_POST['login']." , ваша анкета дезактивирована";}

тогда на confirm и contact реагирует , правда в фразе пользователь ".$_POST['login']." логин не передается, но там, где должно быть update и перенаправление на center.php - все равно не работает.

Не знаю, я наверно вообще что-то не то делаю, но что нужно делать - не знаю. Очень прошу помощи

   
 
 автор: Trianon   (01.12.2007 в 23:27)   письмо автору
 
   для: zeta777   (01.12.2007 в 22:23)
 

перед строкой switch($ff[status])
выведите print_r($ff);
переходы, конечно, отрубятся.
Но Вы хотя бы узнаете, что за пользователя Вам выдал сервер БД по логину и паролю.
Какой у него номер, статус, логин.


Между прочим, писать $ff[id], $ff[status] и т.п. - некорректно. Нужно писать $ff['id'], $ff['status'] и т.д.

   
 
 автор: zeta777   (02.12.2007 в 11:09)   письмо автору
 
   для: Trianon   (01.12.2007 в 23:27)
 

Спасибо, конечно, но мне не надо просто узнать данные пользователя. мне нужно провести update и чтобы пользователь перешел на страницу center.php - это ж скрипт авторизации. . А он на нее не переходит. Просто ничего не происходит, остаешься на странице login.php, как будто никаких данных не вводил, вот и все.
Я не могу понять почему и что делать.
При register_globals on авторизация прекрасно работает. При register_globals off - ни в какую.
Если бы был переход на center.php, но значения переменных не передавались бы - я бы знала что делать. А так - не знаю. Остаешься на login.php и все и никуда не переходишь.

PS: я пишу в скрипте именно $ff['id']. И вообще я внимательно прочитала вашу задачу 21 и изучила все способы ее решения, разбор их недостатков и ваш в том числе способ решения и мне реально это помогло - я поняла то, чего никак не могла уяснить из статей, которые читала по этому поводу. Просто сейчас мне не это важно. Меня эти register_globals off замучили :(. Вернее передача переменных при register_globals off. Потому что, как я понимаю, авторизация не работает потому, что какие-то переменные не передаются. Или могут быть какие-то другие причины? Еще раз повторю, что при register_globals on скрипт работает без проблем.

   
 
 автор: exp   (02.12.2007 в 13:57)   письмо автору
 
   для: zeta777   (02.12.2007 в 11:09)
 

Trianon имел ввиду что не происходит update и перенаправления потому-что
в $ff['status'] (по которому и работает switch) может не оказаться "1"

update и перенаправление включается только если в полученном (из таблицы members) ряду данных о пользователе с введёнными логином и паролем в поле status будет "1"

если не обновляется ldate в таблице profiles (не включается update) и не показывается "Нет такого пользователя" вверху формы значит $ff['status'] не "1"

или "1" ?

   
 
 автор: zeta777   (02.12.2007 в 14:31)   письмо автору
 
   для: exp   (02.12.2007 в 13:57)
 

Я поняла это :) - в смысле, поняла, что он предлагает это сделать, чтобы понять передается ли значение статуса.
Если использовать switch - то статус не передается вообще.

Если использовать if, elseif elseif - то скрипт передает значения статуса, но на статус=1 реагирует непонятно, то есть никак не реагирует - должен перенаправлять с апдейтом, а вместо этого просто оcтается на странице login.php. При это, если статус 0 или 2 - он прекра но реагирует и выводит нужные сообщения. То есть значение статуса ему передается. Почему же он тогда не делает то, что нужно?

   
 
 автор: sim5   (02.12.2007 в 14:39)   письмо автору
 
   для: zeta777   (02.12.2007 в 14:31)
 

А вы проверьте - вместо реалных действий, сделайте вывод на экран, навряд ли 1 присутсвует.

   
 
 автор: zeta777   (02.12.2007 в 14:43)   письмо автору
 
   для: sim5   (02.12.2007 в 14:39)
 

Я проверяла. Еще раз повторю - при switch - нет, значение статуса не выводится вообще.

При if, elseif - выводится правильно, но все равно не апдейтится и не направляет на center.php

   
 
 автор: sim5   (02.12.2007 в 14:56)   письмо автору
 
   для: zeta777   (02.12.2007 в 14:43)
 

Вы хотите сказать, что если 1, то switch робатать не будет никак?

<?
$ff
['status'] = 1;

switch(
$ff['status']) {
  case 
0: echo $ff['status'];
          break;
  case 
1$q "update profiles set ldate='".strtotime(date("d M Y H:i:s"))."' where id='".$ff['status']."'";
          
header("location: test.php");
  case 
2: echo $ff['status'];
}
?>

Я просто заменил строку вашу, и сделал перенаправление. Проверьте, и у вас сработает. Перенаправление не будет, если перед передачей заголовка произойдет ошибка, а у вас вывод ошибок отключен.

   
 
 автор: zeta777   (02.12.2007 в 15:30)   письмо автору
 
   для: sim5   (02.12.2007 в 14:56)
 

Сделала как вы написали - теперь он меня все время на test.php перебрасывает, независимо от того, является ли статус =1 или 0 или 2

   
 
 автор: sim5   (02.12.2007 в 15:35)   письмо автору
 
   для: zeta777   (02.12.2007 в 15:30)
 

Ну надеюсь test.php это временный как и у меня файл. У меня постоянно есть файл main.php, где я проверяю отдельные кусочки кода. Вот то, что я написал выше я прописал в main.php, при $ff['status'] = 0 и 2 я остаюсь в main.php и никак иначе. А вот при 1, есть переход. И у вас так должно быть, ваш РНР от моего ничем не отличается.

   
 
 автор: zeta777   (02.12.2007 в 16:27)   письмо автору
 
   для: sim5   (02.12.2007 в 15:35)
 

Не сомневаюсь, что PHP не отличается, но меня перебраcывает на test.php при любых значениях $ff['status']. У меня файл, конечно не main.php, а login.php и значения статуса должны выводится именно в нем, если статус=0 или 2, если статус равен 1 - должно перебросить на test.php. Теоретически. Практически меня теперь туда перебрасывает при всех значениях статуса :). Ну, да, ладно, я переделала скрипт авторизации без switch, потому как переделать с использованием switch у меня так и не получилось.

   
 
 автор: sim5   (02.12.2007 в 16:34)   письмо автору
 
   для: zeta777   (02.12.2007 в 16:27)
 

Вы прямо таки "фантастический коммент" написали. switch тут не причем, я кусочек вашего кода прописал, в отрыве вообще от всего остального. Пропишите отдельно прстую кострукцию switch - думаю вы сами понимаете, что она у вас работать будет отменно. В реальном же коде (вам это еще ранее предлагал Trianon), заремируйте switch, и вместо этого сделайте вывод на экран:
echo $ff['status'];
exit;
Если вы получите статус равный 1 при этом, то проблемы надо искать после case 1:, а не в самом switch.

   
 
 автор: exp   (02.12.2007 в 15:59)   письмо автору
 
   для: zeta777   (02.12.2007 в 15:30)
 

там в center.php наверняка стоит переадресация на авторизацию при отсутствии
$_COOKIE['auth'] и $_COOKIE['pass'], или если там не находит в базе такого юзера

сделайте в center.php print_r($_COOKIE);
может-быть всё дело в том что вас оттуда переадресовывает обратно ?

   
 
 автор: sim5   (02.12.2007 в 16:23)   письмо автору
 
   для: exp   (02.12.2007 в 15:59)
 

Или после register_globals = off, к кукам обращение не как $_COOKIE, а осталось по старому.

   
 
 автор: zeta777   (02.12.2007 в 16:51)   письмо автору
 
   для: exp   (02.12.2007 в 15:59)
 

ну, да проверка есть. В файле center.php есть include файла member.php, в котором определяются права пользователя. В этом файле есть строчка:

$r=q("select status, rdate from members where id='$auth' and pswd='$pass'");
if(e($r))
{header("Location: login.php");exit;}

Просто я про это не упоминала, потому, что когда проверяла файл login.php я строчку

if(e($r))
{header("Location: login.php");exit;}

из member.php убирала, чтобы понять, это из center.php меня обратно на login.php перебрасывает или я остаюсь там на login.php, никуда не иду. Получалось, что просто я туда (в center.php) не попадаю, потому что без строчки if(e($r))
{header("Location: login.php");exit;} все равно я на login.php оставалась

Но теперь, когда я убрала switch и сделала if - вроде с файлом login.php разобралась. Теперь без строчки проверки я на center.php попадаю.
Теперь проверку на member.php нужно пройти :)

Значит, было так:

$r=q("select status, rdate from members where id='$auth' and pswd='$pass'");
if(e($r))
{header("Location: login.php");exit;}

Делаю так:

$auth=$_COOKIE['auth'];
$pass=$_COOKIE['pass'];
$r=q("select `status`, `rdate` from `members` where `id`='".intval($_COOKIE['auth'])."' and `pswd`='".$_COOKIE['pass']."'");
if(e($r))
{
setcookie("auth", "", time() - 3600*24*30*12, "/");
setcookie("pass", "", time() - 3600*24*30*12, "/");
header("Location: login.php");exit;
};


В общем окончательно у меня получается так:

login.php

$ff = f($r);
if($ff['status']==0) header("Location: login.php?s=confirm");
elseif($ff['status']==2) {header("Location: login.php?s=contact");}
elseif($ff['status']==1)
{
setcookie("auth",intval($_POST['id'], time()+60*60*24*30));
setcookie("pass",$_POST['pswd'], time()+60*60*24*30);
q("update `profiles` set `ldate`='".strtotime(date("d M Y H:i:s"))."' where `id`='".intval($_POST['id'])."'");
d($db);
header("Location: center.php");}


А дальше в member.php проверка идет так:

$auth=$_COOKIE['auth'];
$pass=$_COOKIE['pass'];
$r=q("select `status`, `rdate` from `members` where `id`='".intval($_COOKIE['auth'])."' and `pswd`='".$_COOKIE['pass']."'");
if(e($r))
{
setcookie("auth", "", time() - 3600*24*30*12, "/");
setcookie("pass", "", time() - 3600*24*30*12, "/");
header("Location: login.php");exit;
};


Только она не работает :(. Я опять в login.php оказываюсь, но теперь уже я туда из center.php попадаю.

Еще раз обращаюсь: может есть кто-нибудь, кто сможет помочь мне за оплату?

В принципе мне осталось-то уже немного (я надеюсь) - вот эту самую авторизацию и проверку пройти, чтобы на пользовательскую территорию корректно попадать. То есть всего три файла - login.php (login.php по сути уже работает), member.php и center.php

Просто мне уже неудобно перед всеми, кто мне помогает, я всем очень благодарна, но уже стыдно надоедать глупыми вопросами :)

   
 
 автор: exp   (02.12.2007 в 17:25)   письмо автору
 
   для: zeta777   (02.12.2007 в 16:51)
 

если своими руками хотя-бы переделано , то проще разобраться потом при эксплуатации,
тем-более вам осталось совсем немножко разобраться :)

и уязвимости при разных настройках по разному могут повлиять, можно просто для себя делать скрипт, зная как что у себя настроено. а можно делать ориентируясь на любые возможные включения/выключения
интересный сканер (acunetix vulnerubility scanner) гугл такого не знает , где вы его нашли ?

   
 
 автор: zeta777   (02.12.2007 в 19:27)   письмо автору
 
   для: exp   (02.12.2007 в 17:25)
 

Сканнер http://www.acunetix.com/ Хороший сканнер. Иногда, как мне кажется излишне строг, найдет уязвимость там, где ее нет (или по крайней мере кажется что нет и xspider ничего не находит), но зато там, где она есть - уж точно не пропустит. Хороший анализ выдает. Даже советы по исправлению. Дорогой ($ 4995), но в инете есть рабочая пиратская версия :), которая нормально обновляет базу данных по уязвимостям.

Я понимаю, что если сама сделаю - то лучше разберусь. Но не могу, ну никак эту авторизацию сделать. Знаете, сколько я с ней мучаюсь уже? Не получается. Проблема в том, что я-то не программист вообще, и никогда им не была, училась по книжкам да по статьям в инете, да вот еще по форумам... И из моих знакомых я единственный, кто вообще слышал слово такое - PHP :). Просто этот скрипт больше разработчиками не поддерживается, они предлагают только на новые их скрипты переходить, но ведь и новые их скрипты тоже с register_globals on работают, а я этим скриптом давно пользуюсь и у меня база пользователей большая (но это не проблема, я бы ее как-нибудь переконвертировала), что самое главное - я к нему кучу нужных мне функций приделала, в других скриптах знакомств их вообще нет, обидно терять, оптимизировала нагрузку на базу данных, насколько возможно (тоже, между прочим для меня непосильный труд был :), плюс я его все-таки знаю, как свои пять пальцев, получается все зря.... А времени мало - у меня неожиданно сайт раскрутился :), посещаемость резко выросла, соотв-но опасность того, то кто-то хакнет не сегодня-завтра - реально увеличилась. В общем, поверите - день и ночь сижу, переделываю скрипт, даже по ночам мне уже этот PHP снится (серьезно).

   
 
 автор: Trianon   (02.12.2007 в 19:26)   письмо автору
 
   для: zeta777   (02.12.2007 в 16:51)
 

1. Я бы помог, если б мог глянуть на исходники полностью.
Где можно откопать весь пакет, без необходимости его купить, я не нашел.

2. Собственно мы здесь все (ну почти все) собрались именно затем, чтобы друг у друга просить совета или помощи, и соответственно, друг другу помогать. Так что чему тут можно стыдиться, я не вижу совершенно. Наоборот, то что Вы не пасуете перед нетривиальной задачей, а упорно пытаетесь выяснить, как её забороть (пусть при помощи зала), лишь делает Вам честь. Как минимум в моих глазах - совершенно точно. Неудобно ....... в лыжах и на гамаке. А спрашивать совета, там где этого ждут, вполне удобно.

3. моя аська шесть восемь семь пять восемь девять пять. И если Вы где-нибудь поместите архив с исходниками, я попытаюсь поспособствовать более детально.

   
 
 автор: zeta777   (02.12.2007 в 19:32)   письмо автору
 
   для: Trianon   (02.12.2007 в 19:26)
 

Спасибо большое. Вам прям весь скрипт или только эти файлы? sql файл нужен?

   
 
 автор: Trianon   (02.12.2007 в 19:39)   письмо автору
 
   для: zeta777   (02.12.2007 в 19:32)
 

Нужны все файлы, которые так или иначе втянуты в процесс. В идеале - вообще весь исходный архив + архив файлов с Вашими исправлениями. Больше не меньше.
SQL-дамп тоже будет полезен, можно будет сразу проверить что в базе не так.

   
 
 автор: zeta777   (02.12.2007 в 19:56)   письмо автору
 
   для: Trianon   (02.12.2007 в 19:39)
 

Отослала вам письмо

   
 
 автор: zeta777   (05.12.2007 в 19:17)   письмо автору
 
   для: Trianon   (02.12.2007 в 19:39)
 

Большое спасибо. Все работает.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования