Re: [GENERAL-BG] problem s edna funkcijka

[email protected] (Georgi Chorbadzhiyski) Tue, 04 Jan 2005 19:34:40 +0200
Newsgroups php.general.bg
Organization Unix Solutions Ltd. (http://unixsol.org)
Message-ID <[email protected]>
Бележки не по конкретният проблем, а по-скоро по стила и други грешки.

Viktor Popov wrote:
> az sam novak , zapochnah da se zanimavam s php predi sedmica. V momenta sam
> v zastoj i ne moga da si obiasnia kakvo stava pri izpalnenieto na edna
> funkcia. Nadiavam se, che shte mojete da mi pomognete....
> 
> Tova e chast ot stranica register.php , koiato razrabotvam. Izvarshva se
> validacia, pri natiskaneto na submit button se  izvikva sashtia php fail
> register.php. Eto i php scripta v neia:
> 
> <?php
> include "script/functions.php";
> require 'script/common.inc';

Винаги използвай .php разширение за скриптовете си. Не залитай по разни
.inc .txt или .boza. Сървърът не ги счита за PHP скриптове и ако някой
ги поиска, ще му ги изпрати. Едва ли искаш да ти вземат паролата за
базата данни по този начин.

> $valid = TRUE;

По подразбиране е хубаво да е false :) Така ако изпуснеш някоя проверка
все пак няма да позволиш неправилна регистрация.

> if (isset ($_POST['submit'])) {
>     foreach($_POST as $key=>$value) {
>       $$key = $value;
>     }

Регистрираш глобални променливи, което е напълно излишно замърсяване
на глобалният namespace, отделно по-късно ще се наложи да пишеш за
всяка от тях някакъв код, вместо просто да си направиш итерация върху
масивчето.

>     $valid = $fn = checkLength($fname, 2, 50);
>     $ln = checkLength($family, 2, 50);
>     $valid = $valid && $ln;
>  $cm = checkLength($company,0,50);
>  $valid = $valid && $cm;
>  $ml = checkLength($MOL,0,50);
>  $valid = $valid && $ml;
>  $dnum = checkLength($dannum,0,12);
>  $valid = $valid && $dnum;
>  $bst = checkLength($bulstat,0,12);
>  $valid = $valid && $bst;
>  $phn = checkLength($phone,3,20);
>  $valid = $valid && $phn;
>     $em = checkEmail($email);
>     $valid = $valid && $em;
>  $usr = checkLength($username,4,10);
>  $valid = $valid && $usr;
>     $ps = checkLength($password,4,16);
>     $valid = $valid && $ps;
>  $ps2 = checkLength($password2,4,16);
>     $valid = $valid && $ps2;
>     $ps2 = $password == $password2;
>     $valid = $valid && $ps2;
>  $adr = checkLength($Addr,3,70);
>  $valid = $valid && $adr;
>  $cty = checkLength($City,2,50);
>  $valid = $valid && $cty;
>     $zp = checkLength($zipcode,2,10);
>     $valid = $valid && $zp;

Много лесно може да стане грешка с тези игри, който играеш
около $valid. Защо просто не изредиш всички условия в един

  if (x && y && z)
    $valid = true;

>     if ($valid) {
> //-----------------------------------------CHECK
> THIS-------------------------------
>               doReg($fname,$family,$company, $MOL, $dannum, $bulstat,
> $phone, $email, $username, $password, $payment, $maillist, $Addr, $City,
> $zipcode,$Country, $shippingName, $shippingFamily, $shippingphone,
> $shippingAddr,
> $shippingcity, $shippingzipcode, $shippingCountry);

Ето тук масивчето за което говорих в началото би било удобно.

>   exit;
> 
>            }
> } else {
>     $fn = $ln = $cm = $ml = $dnum = $bst = $phn = $em = $usr = $ps = $ps2 =
> $adr = $cty = $zp = TRUE;
>     $fname = $family = $company = $MOL = $dannum = $bulstat = $phone =
> $email = $username = $password = $password2 = $Addr = $City = $zipcode = '';
> }
> 
> ?>
> 
> Funkciata doReg se namira v faila functions.php. Tq bi triabvalo da
> insert-va v tablica "users", no ne go pravi. i ne moga da razbera zashto.
> Kogato opitah na nejno miasto da izpolzvam  mysql_pconnect(...) i
> mysql_db_query(...) vsichko se poluchi. Eto i deklaraciata na doReg() vav
> functions.php:
> 
> function doReg($fname1="",$family1="",$company1="", $MOL1="", $dannum1="",
> $bulstat1="", $phone1="", $email1="", $username1="", $password1="",
> $payment1="", $maillist1="", $Addr1="", $City1="", $zipcode1="",
> $Country1="", $shippingName1="", $shippingFamily1="", $shippingphone1="",
> $shippingAddr1="", $shippingcity1="", $shippingzipcode1="",
> $shippingCountry1="")

Защо ги инициализираш? Така ги правиш незадъ;жите;ни за подаване към функцията.
Като гледам колко са на брой, такова объркване може да стане кой, кой е по ред,
че да се блъскаш 2 часа с някоя дребна грешка.

> {
> 
>   mysql_pconnect ($DB_SERVER, $DB_LOGIN, $DB_PASSWORD);
> 
> 
>   mysql_db_query($DB, "insert into users(name,family,company, MOL, taxnum,
> bulstat, phone, email, username, password, payment, maillist, Addr, City,
> zipcode, Country, shippingName, shippingFamily, shippingphone, shippingAddr,
> shippingcity, shippingzipcode, shippingCountry)
> values('$fname1','$family1','$company1', '$MOL1', '$dannum1', '$bulstat1',
> '$phone1', '$email1', '$username1', '$password1', '$payment1', '$maillist1',
> '$Addr1', '$City1', '$zipcode1',
> '$Country1','$shippingName1','$shippingFamily1',
> '$shippingphone1','$shippingAddr1', '$shippingcity1', '$shippingzipcode1',
> '$shippingCountry1')");

Ух, ох :-( Класически SQL Injection. Не прави така. Всеки параметър, който подаваш
към базата данни трябва да бъде проверен и изчистен от "лошите" символи. Виж

addslashes()
mysql_escape() ???

и като цяло поразгледай разултатите от http://www.google.com/search?hl=bg&q=sql+injection

http://www.php.net/manual/en/security.php
http://www.securiteam.com/securityreviews/5DP0N1P76E.html

Не разчитай magic_quotes_gpc да работят. Те не са начина да си сигурен че в
подадените данни няма кофти работи.

> }
> 
> Mojete li da mi kajete zashto ne moje da zaraboti?

-- 
Georgi Chorbadzhiyski
http://georgi.unixsol.org/