Pereiti prie turinio

Danielius5

Nariai
  • Pranešimai

    41
  • Užsiregistravo

  • Lankėsi

  • Laimėta dienų

    1
  • Atsiliepimai

    0%

Reputacijos išklotinė

  1. Patinka
    Danielius5 gavo reakciją nuo Miega Dan13liu5 (danielius5)   
    Hem kodėl tu šneki ko pats nežinai taip man patinka mastyti neturiu beveik nė vieno žaidimo ir tikrai nenolifinu visą diena sėdžių prie programavimo ir dabar pradėjau mokytis css, nuo bendraamžių atstumtas neesu ir jau "dalbajobas" tai jau atsiprašau, jei jau tokiais žodžiais mėtaisi tai matosi kad pats esi kažkoks nedabrendęs nes nesugebi normaliai šnekėt ir iš kart pradedi savo stumimus kaip 15 metis. Nesupratinti nei manęs nei mano draugų, iš kart švaistaisi savo nuomonę ir jautiesi protingesnis už visus kitus, tokių žmonių niekas nemėgsta. Sėkmės. Draugai ne loleriai o subrendę žmonės. jei matai tik lolerius tai pažiūrėk į veidrodį ir pagalvok ar matomas žmogus tikrai yra geresnis.
  2. Patinka
    Danielius5 gavo reakciją nuo Auksinis Mokytis programavimo: Kursai vs Savamokslis   
    Gal rašau ir po daug laiko na bet mokinuosi pats, turiu pažįstamų kurie tikrai kada riekia padeda, taip pat turiu w3schools ir php.net, kas labai gerai padeda, man yra 13 metų, bet stengiuosi įvaldyti php ir mysql savomis rankomis, iš tiesų net neturiu litų ant kokių nors kursų, bet man tai ne motais, kursuose dažnai prikemša to, ko tau nereikia ir niekada nereikės, todėl pačiam mokytis mano manymu yra geriau, ko tau tikrai reikia tą ir išmoksi o visą kitą bruda galėsi pamiršti :)
  3. Patinka
    Danielius5 gavo reakciją nuo Sprunkas PDO register/login + xss apsauga + xss atakos fixeris   
    Sveiki taigi pagalvojau parašyti PDO registracija/prisijungima taigi ko mums reikės -> index.php failo, .htaccess failo, funkcijos.php failo (nors funkcios tik dvi, bet manau kad jei bus padaryta atskirame faile suprasite daugiau :) mysql duom bazes ir users table. tai pradėkime :)
    visu pirma, kodėl PDO? nes PDO tai yra naujausias ir geriausias būdas daryti užklausas duom bazei, teisingai naudojamas PDO panaikina mysql injekcijos galimybę taip padarydamas puslapį saugesnį :)
    užeiname į mysql ir susikuriam table users ten sukuriame columns `id` su auto_incrementu `n`, `p`, `d`,`ip`
    tada sukuriame kita table log kur sukuriame columns `id` su auto_increment,`ip`,`d`,`v`,`b`
    atsirdarome funkcijos.php faila ir įrašome connect funkcija:

    function conn() { GLOBAL $dbh, $aplankas; $username = 'tavoduombazesuser'; $password = 'tavoduombazespwd'; try { $dbh = new PDO("mysql:host=localhost;dbname=tavoduombaze", $username, $password); echo ''; } catch(PDOException $e) { echo $e->getMessage(); } }
    Na tai čia yra mysql connect funkcija su PDO. Pakeiskit viska kas prasideda "tavo.." į savo duomenis.
    galime tęsti darbą. Padarykime dvi formas registracijos ir prisijungimo index.php faile (P.S. ŠRIFTUOTA TURI BŪTI Į UFT-8 WITHOUT BOM!) nes jei bus uft-8 mėtys warnings ir neveiks sesijos mėtys kažką tokio (Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by)

    <?php session_start(); include ("funkcijos.php"); conn (); ?> <html> <HEAD> <meta charset="utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </HEAD> <body> <?php if(!isset($_SESSION['login'])) { //patikrinam ar nėra sesijos login, sesija login bus sukurta kai prisijungsim if(!isset($_GET['action'])) { //patikrinam ar nėra get metode jokio action ?> <center><h1>Prisijungimas</h1></center><br/> <form action='index.php?action=login'method='post'> Vartotojo vardas:<br/><input name='n' placeholder=' Vartotojo vardas'><br/> Slaptažodis:<br/><input name='p' type='password' placeholder=' Slaptažodis'><br/> <input type='submit' value='Prisijungti'></form><br/><br/> <center><h1>Registracija</h1></center><br/> <form action='index.php?action=reg 'method='post'> Vartotojo vardas:<br/><input name='n' placeholder=' Vartotojo vardas'><br/> Slaptažodis:<br/><input name='p' type='password' placeholder=' Slaptažodis'><br/> <input type='submit' value='Registruotis'></form> <?php } // uždarom if salygą ?></body></html>
    Na štai turime reg ir login Formas. na o dabar grįžkime į funkcijų failą ir sukurkime fixerio xss atakų funkcija.

    function safe ($i,$input) { $username = 'tavodbuser'; $password = 'tavodbpw'; try { $dbh = new PDO("mysql:host=localhost;dbname=tavodb", $username, $password); echo ''; } catch(PDOException $e) { echo $e->getMessage(); } // nezinau kodėl bet kažkodėl reikia junktis iš naujo, nes kitaip neveikia if(strpos($i,"<script>")!== FALSE OR strpos($i,"</script>")!== FALSE) { /* xss ataka daroma su tagu "<script>" todel neleide jo įrašyt apsaugosime nuo atakos ir fixinsime bandymus */ $i = htmlspecialchars($i); // paverčiame visus < > ir kt ko nereikia spec simboliais $date = date("Y-m-d H:i"); // išgaunam data metai-menuo-diena valanda:minutes $ip = $_SERVER['REMOTE_ADDR']; // išgaunam ip adresa $get = $dbh->prepare("SELECT * FROM `log` WHERE `ip`=? AND `v`=?"); // su PDO patikrinam ar jau yra bandyta laužtis su šiuo ip per šitą vietą $get -> execute (array($ip,$input)); $get = $get->fetch(); if($get) { // jeigu yra bandyta tiesiog updatinsim data $info = $dbh->prepare("UPDATE `log` SET `d`=?,`b`=? WHERE `ip`=?"); // updatinam $info -> execute (array($date,$i,$ip)); // b kintamasis yra pravalytas ivestas tekstas $op = fopen(".htaccess","c+"); // atidarome htaccess faila fwrite($op, "deny from ".$ip); //įrašome ip draudimo funkcija įrašius ja žmogus nurodytu ip adresu negalės pasiekti tinklapio fclose($op); // uždarome faila } else { // o jeigu iš šio ip per šia vietą nebuvo bandoma xss tada iterpsim nauja bandyma į duom baze $info = $dbh->prepare("INSERT INTO `log` (`ip`,`d`,`v`,`b`) VALUES (?,?,?,?)"); // iterpiam bandyma $info -> execute (array($ip,$date,$input,$i)); $op = fopen(".htaccess","c+"); // įrašom į .htaccess kad nebeleistu įeiti fwrite($op, "deny from ".$ip); // įrašom į .htaccess kad nebeleistu įeiti fclose($op); //uždarome } Die(" <span style='color:red;'>Patikėk mūsų sistema parašyta gerai ir tokie kaip tu jokiu būdu nesugebės pakenkti, o tavo kvaili mėginimai baigsis blogai tik tau pačiam ;) </span> "); // išvedame die klaida (die klaida išveda į ekrana teksta ir nutraukia visa koda esanti po ja } else { return $i;} }
    Fsio fixerį jau padarėm dabar tęskim darbus :) einam į index.php ir po

    <?php } // uždarom if salygą
    sukuriame register sistemą ;)

    if(isset($_GET['action'] && $_GET['action'] == "reg") { // jeigu get metodu siunčiama "action" ir action = reg tada vykdysime koda tarp lauštinių skliaustų if(isset($_SESSION['login'])) { echo "<meta http-equiv="refresh" content="0;url=http://errqraz.us.lt/darbas/disabled.php" />"; } // jeigu bando registruotis prisijunges mes į pagrindini puslapi else { if(isset($_POST['n']) && isset($_POST['p']) && !empty($_POST['n']) && !empty($_POST['p']) { // patikrinam ar siunčiami n ir p ir ar jie ne tušti $n = safe($_POST['n'],"register"); //prafiltuojam gaunamus duomenis su musu fixeriu $p = safe($_POST['p'],"register"); //prafiltuojam gaunamus duomenis su musu fixeriu $n = htmlspecialchars($n); // del visa ko praeinam pro xss filtra $p = htmlspecialchars($p); // del visa ko praeinam pro xss filtra $n1 = strlen($n); // patikrinam ilguma, strlen skaiciuoja simboliu kieki $p1 = strlen($p); if($n1 >30 OR $n1 <6 OR $p1 >30 OR $p1 < 6) { echo "nickas ir passwordas turi būti 6-30 simbolių ilgumo"; } else {$info = $dbh->prepare("SELECT * FROM `users` WHERE n=?"); // patikrinam ar toks nick neregistruotas $info -> execute (array($n)); $info = $info->fetch(); if($info) { // jeigu registruotas echo "toks nick registruotas"; } else { if($n == $p) { echo "Vesk slaptažodį kitokį nei vartotojo vardą."; } else { // na va pagrindinius dalykus apėjome dabar kiškime į duom bazę $date = date("Y-m-d H:i"); $ip = $_SERVER['REMOTE_ADDR']; require("password.php"); // includinam biblioteką, nes ne visos php versijos palaikys šia funkcija $hash = password_hash($p, PASSWORD_DEFAULT); /*užkoduojam slaptažodį, tai pats saugiausias būdas užkodavimo todėl kad viena žodį hashinant 10 kartų bus 10 skirtingų hash, todėl iškoduoti labai sunku (rodos neįmanoma net)*/ $reg = $dbh->prepare("INSERT INTO `users`(n,p,d,ip,) VALUES (?,?,?,?)"); $reg -> execute (array($n,$hash,$date,$ip)); echo "Sėkmingai užregistruotas!"; //registracija baigta } }} } else { // jeigu tušti echo "Kažko neįvedei"; }
    Na liko login ;D
     

    if(isset($_GET['action']) && $_GET['action']=="login") { if(isset($_POST['n']) && isset($_POST['p']) && !empty($_POST['n']) && !empty($_POST['p'])) { $n = safe($_POST['n'],"login"); // jei bus isilauzimo bandymas rodys kad lauztasi per login $p = safe($_POST['p'],"login"); $n = htmlspecialchars($n)); $p = htmlspecialchars($p)); $info = $dbh->prepare("SELECT * FROM `users` WHERE n=?"); $info -> execute (array($n)); $info = $info->fetch(); $ip = $_SERVER['REMOTE_ADDR']; if($info) { // jeigu yra toks vartotojas require("password.php"); //vel includinam biblioteka if(password_verify($p, $info['p']) ) { // čia funkcija kuri sulygina ar gali but tam passwordui toks hash echo "Sėkmingai prisijungei"; $_SESSION['login']=true; $_SESSION['n']=$n; } else { echo "slaptažodis neteisingas!"; } } else { echo"nėra tokio vartotojo!";}
    na ka teliko sukurti password.php failą sukuriam ir ten įrašom ši kodą, ir uždarom daugiau mum jo nereikės :) nes čia tiesiog biblioteka ;)
     

    <?php /** * A Compatibility library with PHP 5.5's simplified password hashing API. * * @author Anthony Ferrara <[email protected]> * @license http://www.opensource.org/licenses/mit-license.html MIT License * @copyright 2012 The Authors */ namespace { if (!defined('PASSWORD_DEFAULT')) { define('PASSWORD_BCRYPT', 1); define('PASSWORD_DEFAULT', PASSWORD_BCRYPT); /** * Hash the password using the specified algorithm * * @param string $password The password to hash * @param int $algo The algorithm to use (Defined by PASSWORD_* constants) * @param array $options The options for the algorithm to use * * @return string|false The hashed password, or false on error. */ function password_hash($password, $algo, array $options = array()) { if (!function_exists('crypt')) { trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING); return null; } if (!is_string($password)) { trigger_error("password_hash(): Password must be a string", E_USER_WARNING); return null; } if (!is_int($algo)) { trigger_error("password_hash() expects parameter 2 to be long, " . gettype($algo) . " given", E_USER_WARNING); return null; } $resultLength = 0; switch ($algo) { case PASSWORD_BCRYPT: // Note that this is a C constant, but not exposed to PHP, so we don't define it here. $cost = 10; if (isset($options['cost'])) { $cost = $options['cost']; if ($cost < 4 || $cost > 31) { trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING); return null; } } // The length of salt to generate $raw_salt_len = 16; // The length required in the final serialization $required_salt_len = 22; $hash_format = sprintf("$2y$%02d$", $cost); // The expected length of the final crypt() output $resultLength = 60; break; default: trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING); return null; } $salt_requires_encoding = false; if (isset($options['salt'])) { switch (gettype($options['salt'])) { case 'NULL': case 'boolean': case 'integer': case 'double': case 'string': $salt = (string) $options['salt']; break; case 'object': if (method_exists($options['salt'], '__tostring')) { $salt = (string) $options['salt']; break; } case 'array': case 'resource': default: trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING); return null; } if (PasswordCompat\binary\_strlen($salt) < $required_salt_len) { trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", PasswordCompat\binary\_strlen($salt), $required_salt_len), E_USER_WARNING); return null; } elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) { $salt_requires_encoding = true; } } else { $buffer = ''; $buffer_valid = false; if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) { $buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM); if ($buffer) { $buffer_valid = true; } } if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) { $buffer = openssl_random_pseudo_bytes($raw_salt_len); if ($buffer) { $buffer_valid = true; } } if (!$buffer_valid && @is_readable('/dev/urandom')) { $f = fopen('/dev/urandom', 'r'); $read = PasswordCompat\binary\_strlen($buffer); while ($read < $raw_salt_len) { $buffer .= fread($f, $raw_salt_len - $read); $read = PasswordCompat\binary\_strlen($buffer); } fclose($f); if ($read >= $raw_salt_len) { $buffer_valid = true; } } if (!$buffer_valid || PasswordCompat\binary\_strlen($buffer) < $raw_salt_len) { $bl = PasswordCompat\binary\_strlen($buffer); for ($i = 0; $i < $raw_salt_len; $i++) { if ($i < $bl) { $buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255)); } else { $buffer .= chr(mt_rand(0, 255)); } } } $salt = $buffer; $salt_requires_encoding = true; } if ($salt_requires_encoding) { // encode string with the Base64 variant used by crypt $base64_digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; $bcrypt64_digits = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $base64_string = base64_encode($salt); $salt = strtr(rtrim($base64_string, '='), $base64_digits, $bcrypt64_digits); } $salt = PasswordCompat\binary\_substr($salt, 0, $required_salt_len); $hash = $hash_format . $salt; $ret = crypt($password, $hash); if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != $resultLength) { return false; } return $ret; } /** * Get information about the password hash. Returns an array of the information * that was used to generate the password hash. * * array( * 'algo' => 1, * 'algoName' => 'bcrypt', * 'options' => array( * 'cost' => 10, * ), * ) * * @param string $hash The password hash to extract info from * * @return array The array of information about the hash. */ function password_get_info($hash) { $return = array( 'algo' => 0, 'algoName' => 'unknown', 'options' => array(), ); if (PasswordCompat\binary\_substr($hash, 0, 4) == '$2y$' && PasswordCompat\binary\_strlen($hash) == 60) { $return['algo'] = PASSWORD_BCRYPT; $return['algoName'] = 'bcrypt'; list($cost) = sscanf($hash, "$2y$%d$"); $return['options']['cost'] = $cost; } return $return; } /** * Determine if the password hash needs to be rehashed according to the options provided * * If the answer is true, after validating the password using password_verify, rehash it. * * @param string $hash The hash to test * @param int $algo The algorithm used for new password hashes * @param array $options The options array passed to password_hash * * @return boolean True if the password needs to be rehashed. */ function password_needs_rehash($hash, $algo, array $options = array()) { $info = password_get_info($hash); if ($info['algo'] != $algo) { return true; } switch ($algo) { case PASSWORD_BCRYPT: $cost = isset($options['cost']) ? $options['cost'] : 10; if ($cost != $info['options']['cost']) { return true; } break; } return false; } /** * Verify a password against a hash using a timing attack resistant approach * * @param string $password The password to verify * @param string $hash The hash to verify against * * @return boolean If the password matches the hash */ function password_verify($password, $hash) { if (!function_exists('crypt')) { trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING); return false; } $ret = crypt($password, $hash); if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != PasswordCompat\binary\_strlen($hash) || PasswordCompat\binary\_strlen($ret) <= 13) { return false; } $status = 0; for ($i = 0; $i < PasswordCompat\binary\_strlen($ret); $i++) { $status |= (ord($ret[$i]) ^ ord($hash[$i])); } return $status === 0; } } } namespace PasswordCompat\binary { /** * Count the number of bytes in a string * * We cannot simply use strlen() for this, because it might be overwritten by the mbstring extension. * In this case, strlen() will count the number of *characters* based on the internal encoding. A * sequence of bytes might be regarded as a single multibyte character. * * @param string $binary_string The input string * * @internal * @return int The number of bytes */ function _strlen($binary_string) { if (function_exists('mb_strlen')) { return mb_strlen($binary_string, '8bit'); } return strlen($binary_string); } /** * Get a substring based on byte limits * * @see _strlen() * * @param string $binary_string The input string * @param int $start * @param int $length * * @internal * @return string The substring */ function _substr($binary_string, $start, $length) { if (function_exists('mb_substr')) { return mb_substr($binary_string, $start, $length, '8bit'); } return substr($binary_string, $start, $length); } }
     
    Na va dabar turime manau gerai apsaugota reg/login sistemą su password hashinimu, visgi rašiau iš galvos tai jei pamatysit klaidų sakykit ištaisysiu nors manau kad gerai viskas turi būti ;) Sėkmės :) Laukiu komentarų ;) PAMOKA KURTA TIK MANO IR BE MANO SUTIKMO NELEIDŽIU NIEKAM JĄ DALINTIS!
  4. Patinka
    Danielius5 sureagavo į Mant1sz Dan13liu5 (danielius5)   
    Gal laikas , man rodos, tai temai eit amžino poilsio, nes čia visiškas turgus padarytas!
  5. Patinka
    Danielius5 gavo reakciją nuo Jasas1 PDO register/login + xss apsauga + xss atakos fixeris   
    Dėkui pasistengsiu tobulėt
     
    Dėkui, kad bent vienas supranta, kad sunku man tokiam amžiui mokytis šios srities :)
  6. Patinka
    Danielius5 sureagavo į LoverDose Dan13liu5 (danielius5)   
    Patiko ši frazė "DAR KART SAKAU NORI IŠSIAIŠKINT PARAŠYK DUOSIU Į PM TELEFONA GALĖSI PASUKT GALĖSIM SUSIMATYT" :D
  7. Patinka
    Danielius5 gavo reakciją nuo Sapoka Dan13liu5 (danielius5)   
    Sveiki taigi esu Danielius iš Vilniaus man yra 13 metų, mokausi gana gerai (7,8,9,10) Labiausiai nepatinkantis dalykas istorija labiausiai patinkantys matematika, fizika. Pasibaigus atostogom eisiu į 8 klasę. Duomiuos informatika šiuo metu labiausiai programavimu, nes man patinka mąstyti. Galvoju gyvenima sieti su IT nes niekas kitas daugiau manęs netraukia. Turiu brolį, bet jis gyvena ne Lietuvoje. Esu be augintinių turėjau graužiką bet kol jis buvo pas mane buvo labai didelė alergija ir dabar yra tiesiog daug lengviau nes įmanoma kvėpuoti. Manau esu draugiškas bet bendrauju daugiausiai ne su savo bendraamžiais todėl, kad neįdomu su jeis :D pagrinde draugai yra +20 metų :) Mėgstu dažnai pakalbėt kokiom nors temom su jeis tiesiog apie gyvenimą nes tokie dalykai man tikrai svarbiau nei varyt su hebra pahmelkes daryt. Mano akys buvo mėlynos bet dabar žalios :) , ūgis 176. Mokinuos php šiais laikais nes man tą kalba labai patiko ir norėčiau tobulint jos žinias. Stengiuos jei ką rašyti tai rašyti kažką naudingo o ne šiaip spaminti, nežinau ar gerai man tai išeina :D (foto veliau įkelsiu) :)
    Sėkmės jums ;)

  8. Patinka
    Danielius5 sureagavo į Mant1sz Dan13liu5 (danielius5)   
    Temos autorius žiūriu labai smulkemniškas... pasakoja apie šeimyninę padėtį (brolius, seses, merginas/moteris/žmonas/meilužes), kalba apie ūgius, svorius, batų išmieras, triusikų dydį ir visus kitus dalykėlius, kurie propoguojami ieskok.lt, pazintys.lt ir t.t. Gal nereiktų taip įsismulkinti. Nematau problemos, jei temos autoriui 13 metų, jei jis bendrauja kaip suaugęs, galima su juo derinti reikalus, galima su juo išgerti alaus, nueiti pas mergas, patūsinti, paprogramuoti, pagalvoti apie kokį verslo planą. Ar iš mano išvardintų dalykų su temos autoriumis mes galėtumėm padaryti? Jei taip, valio, sveikinu atvykus čia. Jei ne... o man atrodo, kad nelabai.. nu sori, gal čia ir neįsitvirtinsi labai. Bet betkuriuo atveju sėkmės tolimesniam gyvenimui. Jei jau 13 metų žinai , kas yra programavimas, didelė tikimybė, kad būdamas 20+ būsi pasiekęs labai daug (turiu draugą iš vaikystės laikų, kuris su kompais gal nuo 5 metų varynėjo geriau nei kiti ir dabar studijuoja Škotijoje prestižiniame universitete, prestižinėje specialybėje). Tad tobulėk ir auk, bet nesitikėk, kad jau dabar daugelis ras su tavim bendrą kalbą. Ir nesupraskit klaidingai manęs, aš neignoruoju žmonių, aš tik realistiškai mąstau.
  9. Patinka
    Danielius5 sureagavo į ArBro Dan13liu5 (danielius5)   
    Žiūriu labai mėgsti lygiuotis į tuos savo vyresnius draugus, lyg jie dievaičiai subrendę būtų. Juk jei pačiam trylika, pats pradėjai nesenai bręsti ir jau jautiesi,jog esi visa galva pranašesnis už bendraamžius? Kur skubi gyventi? Suprantu, jog dauguma tavo bendraamžių yra prilipę prie kompų ir žaidžia žaidimus, kol tu kodini ar ką ten darai, tačiau nereikia nuvertinti jų ir pačiam šokti aukščiau bambos. Jeigu su tais dvidešimtmečiais kalbėti ne apie programavimą, o apie gyvenimą, kurį tik tryliką metų nugyvenai, tai ką jūs ten pakalbat tai neįsivaizduoju. 20 jau kalba kokias mergas tvatino,o su trylikos, kuriam tik nesenai pradėjo kilti ryte anksčiau saulės, tai neįsivaizduoju, kokią temą rasti kasdien (neįsižeisk).
  10. Patinka
    Danielius5 sureagavo į Slapyvardis2014 Dan13liu5 (danielius5)   
    Lai rašo ką jis nori, jam tik 13 metų, nematau nieko blogo tame. Tiesiog atviras ir nuoširdus stengėsi būt. O čia pasmerkė visi iškarto...
  11. Patinka
    Danielius5 sureagavo į tadys13 Dan13liu5 (danielius5)   
    Vaje kokie visi pykti.
    Vietoj jusu programuotojai.. pasiimciau toki vaiki i komanda ismokinciau visko ko pats moku, ir tureciau ateiti gera darbuotoja. O jus cia kritikuojat. Aisku nereikia cia prie pc sedeti, bet jei cia jo pasirinkimas ka jau pakeisi. Nors reiketu keisti truputeli ta pasirinkima ;D
  12. Patinka
    Danielius5 sureagavo į Poliarinis Dan13liu5 (danielius5)   
    Nu tai papasakok placiau apie ka ten diskutuoji, ai dar laukiam nuotraukos kaip zadejai :lol:
  13. Patinka
    Danielius5 sureagavo į dromey Dan13liu5 (danielius5)   
    Papasakok man plačiau apie ką tu su 20+ diskutuoji nors viena tėma
     
    Išmok kritika priimti ir iš jos mokytis. Jei tikrai nori mastyti tai PHP tikrai nesimokink, imk C++, JAVA, C# ar dar kokia panašia.
    O kaip tu sugebi mokytis visa diena 24/7 NON-STOP? :blink:
    Gaila, bet aš taip nesugebu, man reikėtu daryti nors minimalias 5-10min pertraukas <_<
    jei aš taip sugebėčiau, NON-STOP varyt ir produktyviai viska išmokt...
     
    O ši koda tu tikrai rašiai nuo 0 ar tu dalis visas copy + paste? sumetiai, sumetiai ir veikia? ar pas tave galioja šūkis:
    „Teorija - kai viską žinai, bet niekas neveikia, Praktika - kai viskas veikia, bet nežinai kodėl. Programavimas sujungia šiuos abu dalykus - niekas neveikia ir neaišku kodėl...“
    Jei tavo tikrai rašytas tu tikrai gabus esi :) Aš tavo amžiaus nieko nemokėjau ir nežinojau, kas yra programavimas ir t.t., aš neturėjau kas man pasako nuo ko pradėti o pradėjau nuo HTML paskui susradau, kad reikia CSS ir pan ir galu gale priejau to, kad norint, kad veiktu daugiau ne kaip statiniai reikia ir PHP, jau gal 5 metai praėjo nuo pat pradžios :D Bet tema ne apie mane. Ir aš tuo norėjau pasakyti, kad mano atvėju buvo viskas nuo 0 juodai ariant išmokau :) na dabar prie PHP mažai ką darau domiuosi C++ ir JAVA programavimo kalbomis, bet daugiau JAVA :)
     
    Na, bet kaip bebutu rekomenduoju išeik laukan ir gerai praleisk laika su savo bendraamžiais ir daug laiko nors vasara nepraleisk prie PC, nereikia skubėti gyventi kiekvienam gyvenimo momentui yra skirtas tam laikas, toli nenubėgsi taip... Norėčiau dar visko prirašyti, bet to daryti nematau prasmės.
     
    Jei kilo dar klausimu ar neaiškiai parašyta mano, tai
    Klausk - Ir bus atsakyta!
  14. Patinka
    Danielius5 sureagavo į lakuns24 Dan13liu5 (danielius5)   
    Išvadina "Dalbajobu" ir paskui parašo išmok kritiką priimti... :D
    Sveikas atvykęs Dan13liau. Laikyk frontą, aš už tave!
  15. Patinka
    Danielius5 sureagavo į Slapyvardis2014 Dan13liu5 (danielius5)   
    Skaitau ir galvoju. Ar tas vaikis kuris sukūrė temą yra protingesnis už daugelį čia komentuojančių? Manau, kad taip. Visi siūlo išeiti i "kiemą" , o patys sėdi prilipę prie pc :)
  16. Patinka
    Danielius5 gavo reakciją nuo Miega Dan13liu5 (danielius5)   
    Ok aš nemoku priimti bet tu nemoki jos reikšti kalbi savo nuomone ir iš kart nurašai žmogų nors tu jo net nepažįsti. iš viso mano aprašymas ką noriu tą rašau nesuprantu ko tu nori iš manęs visur viską kritikuoji taip žinai daugiau nei aš, bet su tokia savo kritiką labai nervini nes tikrai savo visas kritikas reiški negražiai taip, kad jei čia nebūtų forumas ir aš nesistenkčiau nevartoti necenzuriniu žodžių jau būčiau pasiuntes toli toli. Nepatinka man tokie žmonės kurie jaučiasi labai protingi vaidina labai kietus ir panašiai. Taip žinai daug nu bet leisk tu ir man bent postą parašyt, visur tik viską blogą matai, o į save pažiūrėjęs matai angela į kitus - nenormalių puspročių gaują. Nemėgstu tokių. Neteršk man temos.
  17. Patinka
    Danielius5 gavo reakciją nuo Miega Dan13liu5 (danielius5)   
    Ok aš nemoku priimti bet tu nemoki jos reikšti kalbi savo nuomone ir iš kart nurašai žmogų nors tu jo net nepažįsti. iš viso mano aprašymas ką noriu tą rašau nesuprantu ko tu nori iš manęs visur viską kritikuoji taip žinai daugiau nei aš, bet su tokia savo kritiką labai nervini nes tikrai savo visas kritikas reiški negražiai taip, kad jei čia nebūtų forumas ir aš nesistenkčiau nevartoti necenzuriniu žodžių jau būčiau pasiuntes toli toli. Nepatinka man tokie žmonės kurie jaučiasi labai protingi vaidina labai kietus ir panašiai. Taip žinai daug nu bet leisk tu ir man bent postą parašyt, visur tik viską blogą matai, o į save pažiūrėjęs matai angela į kitus - nenormalių puspročių gaują. Nemėgstu tokių. Neteršk man temos.
  18. Patinka
    Danielius5 gavo reakciją nuo Miega Dan13liu5 (danielius5)   
    Hem kodėl tu šneki ko pats nežinai taip man patinka mastyti neturiu beveik nė vieno žaidimo ir tikrai nenolifinu visą diena sėdžių prie programavimo ir dabar pradėjau mokytis css, nuo bendraamžių atstumtas neesu ir jau "dalbajobas" tai jau atsiprašau, jei jau tokiais žodžiais mėtaisi tai matosi kad pats esi kažkoks nedabrendęs nes nesugebi normaliai šnekėt ir iš kart pradedi savo stumimus kaip 15 metis. Nesupratinti nei manęs nei mano draugų, iš kart švaistaisi savo nuomonę ir jautiesi protingesnis už visus kitus, tokių žmonių niekas nemėgsta. Sėkmės. Draugai ne loleriai o subrendę žmonės. jei matai tik lolerius tai pažiūrėk į veidrodį ir pagalvok ar matomas žmogus tikrai yra geresnis.
  19. Patinka
    Danielius5 gavo reakciją nuo weedman PDO register/login + xss apsauga + xss atakos fixeris   
    na galvojau parašyt pamoka ir toliau jas daryt nu, bet jei jau nereikia tų pamokų nu tai ok patys tada kam reikia tegul ir mokosi. Galvojau parašyt, padaryt kažką gero, na bet jei nereikia tai nereikia, neaiški pamoka tai neaiški nemoku tai nemoku, nieko nepakeisiu :) Jei galit tai parodykit man neišmanamčiam normalias pamokas, pasimokysiu iš jų. :)
  20. Patinka
    Danielius5 gavo reakciją nuo Sprunkas PDO register/login + xss apsauga + xss atakos fixeris   
    Sveiki taigi pagalvojau parašyti PDO registracija/prisijungima taigi ko mums reikės -> index.php failo, .htaccess failo, funkcijos.php failo (nors funkcios tik dvi, bet manau kad jei bus padaryta atskirame faile suprasite daugiau :) mysql duom bazes ir users table. tai pradėkime :)
    visu pirma, kodėl PDO? nes PDO tai yra naujausias ir geriausias būdas daryti užklausas duom bazei, teisingai naudojamas PDO panaikina mysql injekcijos galimybę taip padarydamas puslapį saugesnį :)
    užeiname į mysql ir susikuriam table users ten sukuriame columns `id` su auto_incrementu `n`, `p`, `d`,`ip`
    tada sukuriame kita table log kur sukuriame columns `id` su auto_increment,`ip`,`d`,`v`,`b`
    atsirdarome funkcijos.php faila ir įrašome connect funkcija:

    function conn() { GLOBAL $dbh, $aplankas; $username = 'tavoduombazesuser'; $password = 'tavoduombazespwd'; try { $dbh = new PDO("mysql:host=localhost;dbname=tavoduombaze", $username, $password); echo ''; } catch(PDOException $e) { echo $e->getMessage(); } }
    Na tai čia yra mysql connect funkcija su PDO. Pakeiskit viska kas prasideda "tavo.." į savo duomenis.
    galime tęsti darbą. Padarykime dvi formas registracijos ir prisijungimo index.php faile (P.S. ŠRIFTUOTA TURI BŪTI Į UFT-8 WITHOUT BOM!) nes jei bus uft-8 mėtys warnings ir neveiks sesijos mėtys kažką tokio (Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by)

    <?php session_start(); include ("funkcijos.php"); conn (); ?> <html> <HEAD> <meta charset="utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </HEAD> <body> <?php if(!isset($_SESSION['login'])) { //patikrinam ar nėra sesijos login, sesija login bus sukurta kai prisijungsim if(!isset($_GET['action'])) { //patikrinam ar nėra get metode jokio action ?> <center><h1>Prisijungimas</h1></center><br/> <form action='index.php?action=login'method='post'> Vartotojo vardas:<br/><input name='n' placeholder=' Vartotojo vardas'><br/> Slaptažodis:<br/><input name='p' type='password' placeholder=' Slaptažodis'><br/> <input type='submit' value='Prisijungti'></form><br/><br/> <center><h1>Registracija</h1></center><br/> <form action='index.php?action=reg 'method='post'> Vartotojo vardas:<br/><input name='n' placeholder=' Vartotojo vardas'><br/> Slaptažodis:<br/><input name='p' type='password' placeholder=' Slaptažodis'><br/> <input type='submit' value='Registruotis'></form> <?php } // uždarom if salygą ?></body></html>
    Na štai turime reg ir login Formas. na o dabar grįžkime į funkcijų failą ir sukurkime fixerio xss atakų funkcija.

    function safe ($i,$input) { $username = 'tavodbuser'; $password = 'tavodbpw'; try { $dbh = new PDO("mysql:host=localhost;dbname=tavodb", $username, $password); echo ''; } catch(PDOException $e) { echo $e->getMessage(); } // nezinau kodėl bet kažkodėl reikia junktis iš naujo, nes kitaip neveikia if(strpos($i,"<script>")!== FALSE OR strpos($i,"</script>")!== FALSE) { /* xss ataka daroma su tagu "<script>" todel neleide jo įrašyt apsaugosime nuo atakos ir fixinsime bandymus */ $i = htmlspecialchars($i); // paverčiame visus < > ir kt ko nereikia spec simboliais $date = date("Y-m-d H:i"); // išgaunam data metai-menuo-diena valanda:minutes $ip = $_SERVER['REMOTE_ADDR']; // išgaunam ip adresa $get = $dbh->prepare("SELECT * FROM `log` WHERE `ip`=? AND `v`=?"); // su PDO patikrinam ar jau yra bandyta laužtis su šiuo ip per šitą vietą $get -> execute (array($ip,$input)); $get = $get->fetch(); if($get) { // jeigu yra bandyta tiesiog updatinsim data $info = $dbh->prepare("UPDATE `log` SET `d`=?,`b`=? WHERE `ip`=?"); // updatinam $info -> execute (array($date,$i,$ip)); // b kintamasis yra pravalytas ivestas tekstas $op = fopen(".htaccess","c+"); // atidarome htaccess faila fwrite($op, "deny from ".$ip); //įrašome ip draudimo funkcija įrašius ja žmogus nurodytu ip adresu negalės pasiekti tinklapio fclose($op); // uždarome faila } else { // o jeigu iš šio ip per šia vietą nebuvo bandoma xss tada iterpsim nauja bandyma į duom baze $info = $dbh->prepare("INSERT INTO `log` (`ip`,`d`,`v`,`b`) VALUES (?,?,?,?)"); // iterpiam bandyma $info -> execute (array($ip,$date,$input,$i)); $op = fopen(".htaccess","c+"); // įrašom į .htaccess kad nebeleistu įeiti fwrite($op, "deny from ".$ip); // įrašom į .htaccess kad nebeleistu įeiti fclose($op); //uždarome } Die(" <span style='color:red;'>Patikėk mūsų sistema parašyta gerai ir tokie kaip tu jokiu būdu nesugebės pakenkti, o tavo kvaili mėginimai baigsis blogai tik tau pačiam ;) </span> "); // išvedame die klaida (die klaida išveda į ekrana teksta ir nutraukia visa koda esanti po ja } else { return $i;} }
    Fsio fixerį jau padarėm dabar tęskim darbus :) einam į index.php ir po

    <?php } // uždarom if salygą
    sukuriame register sistemą ;)

    if(isset($_GET['action'] && $_GET['action'] == "reg") { // jeigu get metodu siunčiama "action" ir action = reg tada vykdysime koda tarp lauštinių skliaustų if(isset($_SESSION['login'])) { echo "<meta http-equiv="refresh" content="0;url=http://errqraz.us.lt/darbas/disabled.php" />"; } // jeigu bando registruotis prisijunges mes į pagrindini puslapi else { if(isset($_POST['n']) && isset($_POST['p']) && !empty($_POST['n']) && !empty($_POST['p']) { // patikrinam ar siunčiami n ir p ir ar jie ne tušti $n = safe($_POST['n'],"register"); //prafiltuojam gaunamus duomenis su musu fixeriu $p = safe($_POST['p'],"register"); //prafiltuojam gaunamus duomenis su musu fixeriu $n = htmlspecialchars($n); // del visa ko praeinam pro xss filtra $p = htmlspecialchars($p); // del visa ko praeinam pro xss filtra $n1 = strlen($n); // patikrinam ilguma, strlen skaiciuoja simboliu kieki $p1 = strlen($p); if($n1 >30 OR $n1 <6 OR $p1 >30 OR $p1 < 6) { echo "nickas ir passwordas turi būti 6-30 simbolių ilgumo"; } else {$info = $dbh->prepare("SELECT * FROM `users` WHERE n=?"); // patikrinam ar toks nick neregistruotas $info -> execute (array($n)); $info = $info->fetch(); if($info) { // jeigu registruotas echo "toks nick registruotas"; } else { if($n == $p) { echo "Vesk slaptažodį kitokį nei vartotojo vardą."; } else { // na va pagrindinius dalykus apėjome dabar kiškime į duom bazę $date = date("Y-m-d H:i"); $ip = $_SERVER['REMOTE_ADDR']; require("password.php"); // includinam biblioteką, nes ne visos php versijos palaikys šia funkcija $hash = password_hash($p, PASSWORD_DEFAULT); /*užkoduojam slaptažodį, tai pats saugiausias būdas užkodavimo todėl kad viena žodį hashinant 10 kartų bus 10 skirtingų hash, todėl iškoduoti labai sunku (rodos neįmanoma net)*/ $reg = $dbh->prepare("INSERT INTO `users`(n,p,d,ip,) VALUES (?,?,?,?)"); $reg -> execute (array($n,$hash,$date,$ip)); echo "Sėkmingai užregistruotas!"; //registracija baigta } }} } else { // jeigu tušti echo "Kažko neįvedei"; }
    Na liko login ;D
     

    if(isset($_GET['action']) && $_GET['action']=="login") { if(isset($_POST['n']) && isset($_POST['p']) && !empty($_POST['n']) && !empty($_POST['p'])) { $n = safe($_POST['n'],"login"); // jei bus isilauzimo bandymas rodys kad lauztasi per login $p = safe($_POST['p'],"login"); $n = htmlspecialchars($n)); $p = htmlspecialchars($p)); $info = $dbh->prepare("SELECT * FROM `users` WHERE n=?"); $info -> execute (array($n)); $info = $info->fetch(); $ip = $_SERVER['REMOTE_ADDR']; if($info) { // jeigu yra toks vartotojas require("password.php"); //vel includinam biblioteka if(password_verify($p, $info['p']) ) { // čia funkcija kuri sulygina ar gali but tam passwordui toks hash echo "Sėkmingai prisijungei"; $_SESSION['login']=true; $_SESSION['n']=$n; } else { echo "slaptažodis neteisingas!"; } } else { echo"nėra tokio vartotojo!";}
    na ka teliko sukurti password.php failą sukuriam ir ten įrašom ši kodą, ir uždarom daugiau mum jo nereikės :) nes čia tiesiog biblioteka ;)
     

    <?php /** * A Compatibility library with PHP 5.5's simplified password hashing API. * * @author Anthony Ferrara <[email protected]> * @license http://www.opensource.org/licenses/mit-license.html MIT License * @copyright 2012 The Authors */ namespace { if (!defined('PASSWORD_DEFAULT')) { define('PASSWORD_BCRYPT', 1); define('PASSWORD_DEFAULT', PASSWORD_BCRYPT); /** * Hash the password using the specified algorithm * * @param string $password The password to hash * @param int $algo The algorithm to use (Defined by PASSWORD_* constants) * @param array $options The options for the algorithm to use * * @return string|false The hashed password, or false on error. */ function password_hash($password, $algo, array $options = array()) { if (!function_exists('crypt')) { trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING); return null; } if (!is_string($password)) { trigger_error("password_hash(): Password must be a string", E_USER_WARNING); return null; } if (!is_int($algo)) { trigger_error("password_hash() expects parameter 2 to be long, " . gettype($algo) . " given", E_USER_WARNING); return null; } $resultLength = 0; switch ($algo) { case PASSWORD_BCRYPT: // Note that this is a C constant, but not exposed to PHP, so we don't define it here. $cost = 10; if (isset($options['cost'])) { $cost = $options['cost']; if ($cost < 4 || $cost > 31) { trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING); return null; } } // The length of salt to generate $raw_salt_len = 16; // The length required in the final serialization $required_salt_len = 22; $hash_format = sprintf("$2y$%02d$", $cost); // The expected length of the final crypt() output $resultLength = 60; break; default: trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING); return null; } $salt_requires_encoding = false; if (isset($options['salt'])) { switch (gettype($options['salt'])) { case 'NULL': case 'boolean': case 'integer': case 'double': case 'string': $salt = (string) $options['salt']; break; case 'object': if (method_exists($options['salt'], '__tostring')) { $salt = (string) $options['salt']; break; } case 'array': case 'resource': default: trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING); return null; } if (PasswordCompat\binary\_strlen($salt) < $required_salt_len) { trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", PasswordCompat\binary\_strlen($salt), $required_salt_len), E_USER_WARNING); return null; } elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) { $salt_requires_encoding = true; } } else { $buffer = ''; $buffer_valid = false; if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) { $buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM); if ($buffer) { $buffer_valid = true; } } if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) { $buffer = openssl_random_pseudo_bytes($raw_salt_len); if ($buffer) { $buffer_valid = true; } } if (!$buffer_valid && @is_readable('/dev/urandom')) { $f = fopen('/dev/urandom', 'r'); $read = PasswordCompat\binary\_strlen($buffer); while ($read < $raw_salt_len) { $buffer .= fread($f, $raw_salt_len - $read); $read = PasswordCompat\binary\_strlen($buffer); } fclose($f); if ($read >= $raw_salt_len) { $buffer_valid = true; } } if (!$buffer_valid || PasswordCompat\binary\_strlen($buffer) < $raw_salt_len) { $bl = PasswordCompat\binary\_strlen($buffer); for ($i = 0; $i < $raw_salt_len; $i++) { if ($i < $bl) { $buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255)); } else { $buffer .= chr(mt_rand(0, 255)); } } } $salt = $buffer; $salt_requires_encoding = true; } if ($salt_requires_encoding) { // encode string with the Base64 variant used by crypt $base64_digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; $bcrypt64_digits = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $base64_string = base64_encode($salt); $salt = strtr(rtrim($base64_string, '='), $base64_digits, $bcrypt64_digits); } $salt = PasswordCompat\binary\_substr($salt, 0, $required_salt_len); $hash = $hash_format . $salt; $ret = crypt($password, $hash); if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != $resultLength) { return false; } return $ret; } /** * Get information about the password hash. Returns an array of the information * that was used to generate the password hash. * * array( * 'algo' => 1, * 'algoName' => 'bcrypt', * 'options' => array( * 'cost' => 10, * ), * ) * * @param string $hash The password hash to extract info from * * @return array The array of information about the hash. */ function password_get_info($hash) { $return = array( 'algo' => 0, 'algoName' => 'unknown', 'options' => array(), ); if (PasswordCompat\binary\_substr($hash, 0, 4) == '$2y$' && PasswordCompat\binary\_strlen($hash) == 60) { $return['algo'] = PASSWORD_BCRYPT; $return['algoName'] = 'bcrypt'; list($cost) = sscanf($hash, "$2y$%d$"); $return['options']['cost'] = $cost; } return $return; } /** * Determine if the password hash needs to be rehashed according to the options provided * * If the answer is true, after validating the password using password_verify, rehash it. * * @param string $hash The hash to test * @param int $algo The algorithm used for new password hashes * @param array $options The options array passed to password_hash * * @return boolean True if the password needs to be rehashed. */ function password_needs_rehash($hash, $algo, array $options = array()) { $info = password_get_info($hash); if ($info['algo'] != $algo) { return true; } switch ($algo) { case PASSWORD_BCRYPT: $cost = isset($options['cost']) ? $options['cost'] : 10; if ($cost != $info['options']['cost']) { return true; } break; } return false; } /** * Verify a password against a hash using a timing attack resistant approach * * @param string $password The password to verify * @param string $hash The hash to verify against * * @return boolean If the password matches the hash */ function password_verify($password, $hash) { if (!function_exists('crypt')) { trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING); return false; } $ret = crypt($password, $hash); if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != PasswordCompat\binary\_strlen($hash) || PasswordCompat\binary\_strlen($ret) <= 13) { return false; } $status = 0; for ($i = 0; $i < PasswordCompat\binary\_strlen($ret); $i++) { $status |= (ord($ret[$i]) ^ ord($hash[$i])); } return $status === 0; } } } namespace PasswordCompat\binary { /** * Count the number of bytes in a string * * We cannot simply use strlen() for this, because it might be overwritten by the mbstring extension. * In this case, strlen() will count the number of *characters* based on the internal encoding. A * sequence of bytes might be regarded as a single multibyte character. * * @param string $binary_string The input string * * @internal * @return int The number of bytes */ function _strlen($binary_string) { if (function_exists('mb_strlen')) { return mb_strlen($binary_string, '8bit'); } return strlen($binary_string); } /** * Get a substring based on byte limits * * @see _strlen() * * @param string $binary_string The input string * @param int $start * @param int $length * * @internal * @return string The substring */ function _substr($binary_string, $start, $length) { if (function_exists('mb_substr')) { return mb_substr($binary_string, $start, $length, '8bit'); } return substr($binary_string, $start, $length); } }
     
    Na va dabar turime manau gerai apsaugota reg/login sistemą su password hashinimu, visgi rašiau iš galvos tai jei pamatysit klaidų sakykit ištaisysiu nors manau kad gerai viskas turi būti ;) Sėkmės :) Laukiu komentarų ;) PAMOKA KURTA TIK MANO IR BE MANO SUTIKMO NELEIDŽIU NIEKAM JĄ DALINTIS!
  21. Patinka
    Danielius5 gavo reakciją nuo Sapoka Dan13liu5 (danielius5)   
    Sveiki taigi esu Danielius iš Vilniaus man yra 13 metų, mokausi gana gerai (7,8,9,10) Labiausiai nepatinkantis dalykas istorija labiausiai patinkantys matematika, fizika. Pasibaigus atostogom eisiu į 8 klasę. Duomiuos informatika šiuo metu labiausiai programavimu, nes man patinka mąstyti. Galvoju gyvenima sieti su IT nes niekas kitas daugiau manęs netraukia. Turiu brolį, bet jis gyvena ne Lietuvoje. Esu be augintinių turėjau graužiką bet kol jis buvo pas mane buvo labai didelė alergija ir dabar yra tiesiog daug lengviau nes įmanoma kvėpuoti. Manau esu draugiškas bet bendrauju daugiausiai ne su savo bendraamžiais todėl, kad neįdomu su jeis :D pagrinde draugai yra +20 metų :) Mėgstu dažnai pakalbėt kokiom nors temom su jeis tiesiog apie gyvenimą nes tokie dalykai man tikrai svarbiau nei varyt su hebra pahmelkes daryt. Mano akys buvo mėlynos bet dabar žalios :) , ūgis 176. Mokinuos php šiais laikais nes man tą kalba labai patiko ir norėčiau tobulint jos žinias. Stengiuos jei ką rašyti tai rašyti kažką naudingo o ne šiaip spaminti, nežinau ar gerai man tai išeina :D (foto veliau įkelsiu) :)
    Sėkmės jums ;)

  22. Patinka
    Danielius5 sureagavo į ModestasV PDO register/login + xss apsauga + xss atakos fixeris   
    Wow...
     
    Žmogus tik žengia pirmus žingsnius ( pagal kodą matosi ) ir jūs jau siūlot framework'ą? Kur dingo OOP ir kiti BŪTINI dalykai, kad naudotis framework? Jie nereikalingi jau tapo ar kaip? Nes rimtai... Ateis žalias, išmoks framework'ą ir turėsit žalią žmogų mokantį frameworką vieną - naudos bus?
     
    O tau Danieliau - mokinkis ir toliau, bei mažiau kreipk dėmesio į pasakymus, kad pulk imti framework. Iki jo turi suaugti ir susipažinti su viskuo, kas jį gali sudaryti :) Tik tada tu žinosi kaip greit jį įsisavinti ir judėsi į priekį ;)
  23. Patinka
    Danielius5 gavo reakciją nuo Sprunkas PDO register/login + xss apsauga + xss atakos fixeris   
    Sveiki taigi pagalvojau parašyti PDO registracija/prisijungima taigi ko mums reikės -> index.php failo, .htaccess failo, funkcijos.php failo (nors funkcios tik dvi, bet manau kad jei bus padaryta atskirame faile suprasite daugiau :) mysql duom bazes ir users table. tai pradėkime :)
    visu pirma, kodėl PDO? nes PDO tai yra naujausias ir geriausias būdas daryti užklausas duom bazei, teisingai naudojamas PDO panaikina mysql injekcijos galimybę taip padarydamas puslapį saugesnį :)
    užeiname į mysql ir susikuriam table users ten sukuriame columns `id` su auto_incrementu `n`, `p`, `d`,`ip`
    tada sukuriame kita table log kur sukuriame columns `id` su auto_increment,`ip`,`d`,`v`,`b`
    atsirdarome funkcijos.php faila ir įrašome connect funkcija:

    function conn() { GLOBAL $dbh, $aplankas; $username = 'tavoduombazesuser'; $password = 'tavoduombazespwd'; try { $dbh = new PDO("mysql:host=localhost;dbname=tavoduombaze", $username, $password); echo ''; } catch(PDOException $e) { echo $e->getMessage(); } }
    Na tai čia yra mysql connect funkcija su PDO. Pakeiskit viska kas prasideda "tavo.." į savo duomenis.
    galime tęsti darbą. Padarykime dvi formas registracijos ir prisijungimo index.php faile (P.S. ŠRIFTUOTA TURI BŪTI Į UFT-8 WITHOUT BOM!) nes jei bus uft-8 mėtys warnings ir neveiks sesijos mėtys kažką tokio (Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by)

    <?php session_start(); include ("funkcijos.php"); conn (); ?> <html> <HEAD> <meta charset="utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </HEAD> <body> <?php if(!isset($_SESSION['login'])) { //patikrinam ar nėra sesijos login, sesija login bus sukurta kai prisijungsim if(!isset($_GET['action'])) { //patikrinam ar nėra get metode jokio action ?> <center><h1>Prisijungimas</h1></center><br/> <form action='index.php?action=login'method='post'> Vartotojo vardas:<br/><input name='n' placeholder=' Vartotojo vardas'><br/> Slaptažodis:<br/><input name='p' type='password' placeholder=' Slaptažodis'><br/> <input type='submit' value='Prisijungti'></form><br/><br/> <center><h1>Registracija</h1></center><br/> <form action='index.php?action=reg 'method='post'> Vartotojo vardas:<br/><input name='n' placeholder=' Vartotojo vardas'><br/> Slaptažodis:<br/><input name='p' type='password' placeholder=' Slaptažodis'><br/> <input type='submit' value='Registruotis'></form> <?php } // uždarom if salygą ?></body></html>
    Na štai turime reg ir login Formas. na o dabar grįžkime į funkcijų failą ir sukurkime fixerio xss atakų funkcija.

    function safe ($i,$input) { $username = 'tavodbuser'; $password = 'tavodbpw'; try { $dbh = new PDO("mysql:host=localhost;dbname=tavodb", $username, $password); echo ''; } catch(PDOException $e) { echo $e->getMessage(); } // nezinau kodėl bet kažkodėl reikia junktis iš naujo, nes kitaip neveikia if(strpos($i,"<script>")!== FALSE OR strpos($i,"</script>")!== FALSE) { /* xss ataka daroma su tagu "<script>" todel neleide jo įrašyt apsaugosime nuo atakos ir fixinsime bandymus */ $i = htmlspecialchars($i); // paverčiame visus < > ir kt ko nereikia spec simboliais $date = date("Y-m-d H:i"); // išgaunam data metai-menuo-diena valanda:minutes $ip = $_SERVER['REMOTE_ADDR']; // išgaunam ip adresa $get = $dbh->prepare("SELECT * FROM `log` WHERE `ip`=? AND `v`=?"); // su PDO patikrinam ar jau yra bandyta laužtis su šiuo ip per šitą vietą $get -> execute (array($ip,$input)); $get = $get->fetch(); if($get) { // jeigu yra bandyta tiesiog updatinsim data $info = $dbh->prepare("UPDATE `log` SET `d`=?,`b`=? WHERE `ip`=?"); // updatinam $info -> execute (array($date,$i,$ip)); // b kintamasis yra pravalytas ivestas tekstas $op = fopen(".htaccess","c+"); // atidarome htaccess faila fwrite($op, "deny from ".$ip); //įrašome ip draudimo funkcija įrašius ja žmogus nurodytu ip adresu negalės pasiekti tinklapio fclose($op); // uždarome faila } else { // o jeigu iš šio ip per šia vietą nebuvo bandoma xss tada iterpsim nauja bandyma į duom baze $info = $dbh->prepare("INSERT INTO `log` (`ip`,`d`,`v`,`b`) VALUES (?,?,?,?)"); // iterpiam bandyma $info -> execute (array($ip,$date,$input,$i)); $op = fopen(".htaccess","c+"); // įrašom į .htaccess kad nebeleistu įeiti fwrite($op, "deny from ".$ip); // įrašom į .htaccess kad nebeleistu įeiti fclose($op); //uždarome } Die(" <span style='color:red;'>Patikėk mūsų sistema parašyta gerai ir tokie kaip tu jokiu būdu nesugebės pakenkti, o tavo kvaili mėginimai baigsis blogai tik tau pačiam ;) </span> "); // išvedame die klaida (die klaida išveda į ekrana teksta ir nutraukia visa koda esanti po ja } else { return $i;} }
    Fsio fixerį jau padarėm dabar tęskim darbus :) einam į index.php ir po

    <?php } // uždarom if salygą
    sukuriame register sistemą ;)

    if(isset($_GET['action'] && $_GET['action'] == "reg") { // jeigu get metodu siunčiama "action" ir action = reg tada vykdysime koda tarp lauštinių skliaustų if(isset($_SESSION['login'])) { echo "<meta http-equiv="refresh" content="0;url=http://errqraz.us.lt/darbas/disabled.php" />"; } // jeigu bando registruotis prisijunges mes į pagrindini puslapi else { if(isset($_POST['n']) && isset($_POST['p']) && !empty($_POST['n']) && !empty($_POST['p']) { // patikrinam ar siunčiami n ir p ir ar jie ne tušti $n = safe($_POST['n'],"register"); //prafiltuojam gaunamus duomenis su musu fixeriu $p = safe($_POST['p'],"register"); //prafiltuojam gaunamus duomenis su musu fixeriu $n = htmlspecialchars($n); // del visa ko praeinam pro xss filtra $p = htmlspecialchars($p); // del visa ko praeinam pro xss filtra $n1 = strlen($n); // patikrinam ilguma, strlen skaiciuoja simboliu kieki $p1 = strlen($p); if($n1 >30 OR $n1 <6 OR $p1 >30 OR $p1 < 6) { echo "nickas ir passwordas turi būti 6-30 simbolių ilgumo"; } else {$info = $dbh->prepare("SELECT * FROM `users` WHERE n=?"); // patikrinam ar toks nick neregistruotas $info -> execute (array($n)); $info = $info->fetch(); if($info) { // jeigu registruotas echo "toks nick registruotas"; } else { if($n == $p) { echo "Vesk slaptažodį kitokį nei vartotojo vardą."; } else { // na va pagrindinius dalykus apėjome dabar kiškime į duom bazę $date = date("Y-m-d H:i"); $ip = $_SERVER['REMOTE_ADDR']; require("password.php"); // includinam biblioteką, nes ne visos php versijos palaikys šia funkcija $hash = password_hash($p, PASSWORD_DEFAULT); /*užkoduojam slaptažodį, tai pats saugiausias būdas užkodavimo todėl kad viena žodį hashinant 10 kartų bus 10 skirtingų hash, todėl iškoduoti labai sunku (rodos neįmanoma net)*/ $reg = $dbh->prepare("INSERT INTO `users`(n,p,d,ip,) VALUES (?,?,?,?)"); $reg -> execute (array($n,$hash,$date,$ip)); echo "Sėkmingai užregistruotas!"; //registracija baigta } }} } else { // jeigu tušti echo "Kažko neįvedei"; }
    Na liko login ;D
     

    if(isset($_GET['action']) && $_GET['action']=="login") { if(isset($_POST['n']) && isset($_POST['p']) && !empty($_POST['n']) && !empty($_POST['p'])) { $n = safe($_POST['n'],"login"); // jei bus isilauzimo bandymas rodys kad lauztasi per login $p = safe($_POST['p'],"login"); $n = htmlspecialchars($n)); $p = htmlspecialchars($p)); $info = $dbh->prepare("SELECT * FROM `users` WHERE n=?"); $info -> execute (array($n)); $info = $info->fetch(); $ip = $_SERVER['REMOTE_ADDR']; if($info) { // jeigu yra toks vartotojas require("password.php"); //vel includinam biblioteka if(password_verify($p, $info['p']) ) { // čia funkcija kuri sulygina ar gali but tam passwordui toks hash echo "Sėkmingai prisijungei"; $_SESSION['login']=true; $_SESSION['n']=$n; } else { echo "slaptažodis neteisingas!"; } } else { echo"nėra tokio vartotojo!";}
    na ka teliko sukurti password.php failą sukuriam ir ten įrašom ši kodą, ir uždarom daugiau mum jo nereikės :) nes čia tiesiog biblioteka ;)
     

    <?php /** * A Compatibility library with PHP 5.5's simplified password hashing API. * * @author Anthony Ferrara <[email protected]> * @license http://www.opensource.org/licenses/mit-license.html MIT License * @copyright 2012 The Authors */ namespace { if (!defined('PASSWORD_DEFAULT')) { define('PASSWORD_BCRYPT', 1); define('PASSWORD_DEFAULT', PASSWORD_BCRYPT); /** * Hash the password using the specified algorithm * * @param string $password The password to hash * @param int $algo The algorithm to use (Defined by PASSWORD_* constants) * @param array $options The options for the algorithm to use * * @return string|false The hashed password, or false on error. */ function password_hash($password, $algo, array $options = array()) { if (!function_exists('crypt')) { trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING); return null; } if (!is_string($password)) { trigger_error("password_hash(): Password must be a string", E_USER_WARNING); return null; } if (!is_int($algo)) { trigger_error("password_hash() expects parameter 2 to be long, " . gettype($algo) . " given", E_USER_WARNING); return null; } $resultLength = 0; switch ($algo) { case PASSWORD_BCRYPT: // Note that this is a C constant, but not exposed to PHP, so we don't define it here. $cost = 10; if (isset($options['cost'])) { $cost = $options['cost']; if ($cost < 4 || $cost > 31) { trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING); return null; } } // The length of salt to generate $raw_salt_len = 16; // The length required in the final serialization $required_salt_len = 22; $hash_format = sprintf("$2y$%02d$", $cost); // The expected length of the final crypt() output $resultLength = 60; break; default: trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING); return null; } $salt_requires_encoding = false; if (isset($options['salt'])) { switch (gettype($options['salt'])) { case 'NULL': case 'boolean': case 'integer': case 'double': case 'string': $salt = (string) $options['salt']; break; case 'object': if (method_exists($options['salt'], '__tostring')) { $salt = (string) $options['salt']; break; } case 'array': case 'resource': default: trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING); return null; } if (PasswordCompat\binary\_strlen($salt) < $required_salt_len) { trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", PasswordCompat\binary\_strlen($salt), $required_salt_len), E_USER_WARNING); return null; } elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) { $salt_requires_encoding = true; } } else { $buffer = ''; $buffer_valid = false; if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) { $buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM); if ($buffer) { $buffer_valid = true; } } if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) { $buffer = openssl_random_pseudo_bytes($raw_salt_len); if ($buffer) { $buffer_valid = true; } } if (!$buffer_valid && @is_readable('/dev/urandom')) { $f = fopen('/dev/urandom', 'r'); $read = PasswordCompat\binary\_strlen($buffer); while ($read < $raw_salt_len) { $buffer .= fread($f, $raw_salt_len - $read); $read = PasswordCompat\binary\_strlen($buffer); } fclose($f); if ($read >= $raw_salt_len) { $buffer_valid = true; } } if (!$buffer_valid || PasswordCompat\binary\_strlen($buffer) < $raw_salt_len) { $bl = PasswordCompat\binary\_strlen($buffer); for ($i = 0; $i < $raw_salt_len; $i++) { if ($i < $bl) { $buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255)); } else { $buffer .= chr(mt_rand(0, 255)); } } } $salt = $buffer; $salt_requires_encoding = true; } if ($salt_requires_encoding) { // encode string with the Base64 variant used by crypt $base64_digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; $bcrypt64_digits = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $base64_string = base64_encode($salt); $salt = strtr(rtrim($base64_string, '='), $base64_digits, $bcrypt64_digits); } $salt = PasswordCompat\binary\_substr($salt, 0, $required_salt_len); $hash = $hash_format . $salt; $ret = crypt($password, $hash); if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != $resultLength) { return false; } return $ret; } /** * Get information about the password hash. Returns an array of the information * that was used to generate the password hash. * * array( * 'algo' => 1, * 'algoName' => 'bcrypt', * 'options' => array( * 'cost' => 10, * ), * ) * * @param string $hash The password hash to extract info from * * @return array The array of information about the hash. */ function password_get_info($hash) { $return = array( 'algo' => 0, 'algoName' => 'unknown', 'options' => array(), ); if (PasswordCompat\binary\_substr($hash, 0, 4) == '$2y$' && PasswordCompat\binary\_strlen($hash) == 60) { $return['algo'] = PASSWORD_BCRYPT; $return['algoName'] = 'bcrypt'; list($cost) = sscanf($hash, "$2y$%d$"); $return['options']['cost'] = $cost; } return $return; } /** * Determine if the password hash needs to be rehashed according to the options provided * * If the answer is true, after validating the password using password_verify, rehash it. * * @param string $hash The hash to test * @param int $algo The algorithm used for new password hashes * @param array $options The options array passed to password_hash * * @return boolean True if the password needs to be rehashed. */ function password_needs_rehash($hash, $algo, array $options = array()) { $info = password_get_info($hash); if ($info['algo'] != $algo) { return true; } switch ($algo) { case PASSWORD_BCRYPT: $cost = isset($options['cost']) ? $options['cost'] : 10; if ($cost != $info['options']['cost']) { return true; } break; } return false; } /** * Verify a password against a hash using a timing attack resistant approach * * @param string $password The password to verify * @param string $hash The hash to verify against * * @return boolean If the password matches the hash */ function password_verify($password, $hash) { if (!function_exists('crypt')) { trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING); return false; } $ret = crypt($password, $hash); if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != PasswordCompat\binary\_strlen($hash) || PasswordCompat\binary\_strlen($ret) <= 13) { return false; } $status = 0; for ($i = 0; $i < PasswordCompat\binary\_strlen($ret); $i++) { $status |= (ord($ret[$i]) ^ ord($hash[$i])); } return $status === 0; } } } namespace PasswordCompat\binary { /** * Count the number of bytes in a string * * We cannot simply use strlen() for this, because it might be overwritten by the mbstring extension. * In this case, strlen() will count the number of *characters* based on the internal encoding. A * sequence of bytes might be regarded as a single multibyte character. * * @param string $binary_string The input string * * @internal * @return int The number of bytes */ function _strlen($binary_string) { if (function_exists('mb_strlen')) { return mb_strlen($binary_string, '8bit'); } return strlen($binary_string); } /** * Get a substring based on byte limits * * @see _strlen() * * @param string $binary_string The input string * @param int $start * @param int $length * * @internal * @return string The substring */ function _substr($binary_string, $start, $length) { if (function_exists('mb_substr')) { return mb_substr($binary_string, $start, $length, '8bit'); } return substr($binary_string, $start, $length); } }
     
    Na va dabar turime manau gerai apsaugota reg/login sistemą su password hashinimu, visgi rašiau iš galvos tai jei pamatysit klaidų sakykit ištaisysiu nors manau kad gerai viskas turi būti ;) Sėkmės :) Laukiu komentarų ;) PAMOKA KURTA TIK MANO IR BE MANO SUTIKMO NELEIDŽIU NIEKAM JĄ DALINTIS!
  24. Patinka
    Danielius5 sureagavo į Gugiss Dar viena mano TVS   
    Panaši į ankstesnę mano kurtą TVS tik šįsyk parašyta su Laravel frameworku.
    Šioje TVS yra keli pavyzdiniai moduliai:

    Parduotuvė su integruota Paysera (mokejimai.lt) sistema
    Lankomumo statistika
    Meniu kūrimo modulis
    Tekstinio widgeto modulis

     
    https://github.com/augis1/laravel-cms
     
    Demo: http://cms.impressive.lt
     
    Jei turit klausimų, komentarų ar kritikos - nesivaržykit B-)
  25. Patinka
    Danielius5 sureagavo į Arnas PDO register/login + xss apsauga + xss atakos fixeris   
    geriau vietoj šitos pamokos pasiskaityk apie duombazių strukturizavimą ir jos duomenų valdymą, darbui su dideliais duomenų srautais. Tai opi problema, ypač pradedantiesiems, ir pats išmoksi ir galėsi kitiems pamoką pravesti, nes informacijos apstu, o atsirinkti sunku. Mano manymu tai viena iš didesnių klaidų programuojant, kuomet žmogus sukuria projektą nesitikėdamas, kad 5 milijonai įrašų sukels nežmoniškas apkrovas, o laiko taisyti jau nebus. Pats iš to pasimokiau jau
×
×
  • Pasirinkite naujai kuriamo turinio tipą...