Re: [GENERAL-BG] problem s edna funkcijka
| From: | Andrey Hristov | Date: | Wed, 05 Jan 2005 09:30:34 +0000 |
| Subject: | Re: [GENERAL-BG] problem s edna funkcijka | ||
| References: | 1 2 | Groups: | php.general.bg |
| Request: | Send a blank email to general-bg+get-226@lists.php.net to get a copy of this message | ||
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 :) Така ако изпуснеш някоя проверка все пак няма да позволиш неправилна регистрация.
Ако все пак иска, може да погледне функцията extract(), която е доста полезна и спестява писане на код.if (isset ($_POST['submit'])) { foreach($_POST as $key=>$value) {Регистрираш глобални променливи, което е напълно излишно замърсяване на глобалният namespace, отделно по-късно ще се наложи да пишеш за всяка от тях някакъв код, вместо просто да си направиш итерация върху масивчето.$$key = $value;}
Аз бих препоръчал един обект от клас stdClass, може да се итерира както масивите :). Такъв обект е доста близък до struct в C.$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;Защо ги инициализираш? Така ги правиш незадъ;жите;ни за подаване към функцията. Като гледам колко са на брой, такова объркване може да стане кой, кой е по ред, че да се блъскаш 2 часа с някоя дребна грешка. Тук примерно обект е по-удобен :)}} 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="")
http://bg2.php.net/manual/en/function.mysql-escape-string.php Аз лично не бих препоръчал addslashes(), когато се работи с MySQL, тъй като ext/mysql си има функция за това.{ 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?