Re: [GENERAL-BG] problem s edna funkcijka
[email protected] (Andrey Hristov) Wed, 05 Jan 2005 10:30:34 +0100
| Newsgroups | php.general.bg |
|---|---|
| Message-ID | <[email protected]> |
Georgi Chorbadzhiyski wrote:
> Бележки не по конкретният проблем, а по-скоро по стила и други грешки.
Което ме кара още повече да си мисля дали не е добра идеята Жоро Чорбаджийски,
да изнесе една лекция по писане на сигурни скриптове.
> 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, отделно по-късно ще се наложи да пишеш за
> всяка от тях някакъв код, вместо просто да си направиш итерация върху
> масивчето.
Ако все пак иска, може да погледне функцията extract(), която е доста полезна
и спестява писане на код.
>
>> $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);
>
>
> Ето тук масивчето за което говорих в началото би било удобно.
>
Аз бих препоръчал един обект от клас stdClass, може да се итерира както
масивите :). Такъв обект е доста близък до struct в C.
>> 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://bg2.php.net/manual/en/function.mysql-escape-string.php
Аз лично не бих препоръчал addslashes(), когато се работи с MySQL, тъй като
ext/mysql си има функция за това.
> и като цяло поразгледай разултатите от 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?
>
>
Поздрави,
Андрей