Gå til innhold

NH

Medlemmer
  • Innlegg

    190
  • Ble med

  • Besøkte siden sist

Innlegg skrevet av NH

  1. md5 og sha1 er teoretisk like sikkert. Begge er en hash og kan stort sett kun brytes ved bruteforce. bytt passordet, og brukernavnet som nevnt tidligere. Endre måten siden kjenner igjen en som allerede er innlogget. sett også en timeout på sessionen din.

     

    <?php
    //ced innlogging
    $_SESSION['har_logga_inn'] = $_SERVER['REMOTE_ADDR'];
    $_SESSION'['time'] = time();
    ?>
    
    <?php
    //ved kontroll om innlogging.
    if($_SESSION['time'] > time() + 1500 && $_SESSION['har_logga_inn'] == $_SERVER['REMOTE_ADDR']){
    //Logga inn
    } else {
    //vis loginformen
    }
    ?>
    

  2. Da er nok ikke sikkerheten i sytemet ditt spesielt sikkert. Om jeg fikk se kildekoden til scriptet ditt hadde jeg hatt en større kansje til å hjelpe deg.

     

    - Valider info før det sendes til SQL, f.eks:

     

    SELECT * from brukere WHERE brukernavn='$_POST[brukernavn]

     

    er inden god ide. bruk mysql_real_escape_string() og andre valideringsmåter du måtte ønske,

     

    Sørg også for at du ikke kun lager en enkel kjeks satt til en standard verdi. En kjeks er ikke vanvskelig å opprette selv.

  3. er det snakk om et bilde, er explode med . ikke mest opptimale løsning. alle kan da rename et script til .jpg (om denne filen includes gjennom include() vil innholdet bli kjørt som php uansett)

     

    Ved validering av bilder er det langt mere sikkert å sjekke filypen med metoder som:

     

    - exif_imagetype() (exif funksjonene er en extension, ikke alle servere har denne, men om de har er den å annbefale)

     

    - getimagesize() (Denne lager et array, id 2 inneholder en int som forteller deg hva slags bildetype det er

     

    her er exif_imagetype() førstevalget om du har tilgang til det, dette fordi getimagesize() extracter mer info du kansje ikke har bruk for...

  4. Går her utifra at du har en tabellstruktur som ser slik ut:

     

    id | navn | epost

     

    Da du ikke spesifiserte tabellstrukturen laget jeg kun et eksempel.

     

    uansett, her:

    <?php
    class minsql{
    var $hostname = 'localhost';
    var $username = 'root';
    var $password = '';
    var $db;
    
    function sql($db = 'mindb'){
     $this->db = $db;
     
     $ret = mysql_connect($this->hostname, $this->username, $this->password);
     mysql_select_db($db, $ret);
     return $ret;
    }
    
    function getDB(){
     return $this->db;	
    }
    }
    
    
    
    $action = (int) $_GET['action'];
    $id = (int) $_GET['id']; //tilhørende id i tabell rekken(fra edit knappen eller no)
    
    switch($action){
    case 1:
     formOut($id);	
     break;
    case 2:
     updateField($id);
     break;
    default:
     	if(empty($id)){
       die("Det oppstod en feil, mottok ingen ID");	
     	}
     	formOut($id);
    }
    
    
    function formOut($id){
    $conn = new minsql();
    
    $sql = "SELECT * from tabell WHERE id='$id LIMIT 1";
    $result = mysql_query($sql, $conn);
    
    if($result){
     mysql_close($conn);
     
     $data = mysql_fetch_object($result);
     
     printf('<form method="GET" action="%s?">
       <input type="hidden" name="id" value="%d">
       <input type="hidden" name="action" value="2">
       <input type="text" name="navn" value="%s"><br>
       <input type="text" name="epost" value="%s"><br>
       <input type="submit" name="update" value="Oppdater">', $_SERVER['PHP_SELF'], $id, $data->navn, $data->epost);	
     
    } else {
     echo "Fant ingen oppføring med id: $id";	
    }
    
    }
    
    function updateField($id){
    
    $navn = preg_match('@^[a-zæøå]$@i', $_GET['navn']);
    $epost = preg_match('/^[a-zæøå0-9_-\.]{1, }@[a-z0-9_-\.]\.[a-z]{2,4}$/i', $_GET['epost']);
    
    $conn = new minsql();
    
    $sql = "UPDATE tabell SET
     	navn='$navn',
     	epost='$epost'
     	WHERE id='$id'";
    
    $result = mysql_query($sql, $conn);
    
    if($result){
     echo "Tabell oppdatert";	
    } else {
     echo "Det oppstod en feil ved oppdateringen";	
    }
    
    }
    
    ?>
    

  5. eksempel hentet fra phpManualen.

     

    Denne quote_smart() funksjonen er faktisk veldig fin

     

    <?php
    // Quote variable to make safe
    function quote_smart($value)
    {
      // Stripslashes
      if (get_magic_quotes_gpc()) {
          $value = stripslashes($value);
      }
      // Quote if not integer
      if (!is_numeric($value)) {
          $value = "'" . mysql_real_escape_string($value) . "'";
      }
      return $value;
    }
    
    // Connect
    $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
      OR die(mysql_error());
    
    // Make a safe query
    $query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
              quote_smart($_POST['username']),
              quote_smart($_POST['password']));
    
    mysql_query($query);
    ?> 
    

  6. Dette scriptet validerer ingenting! Her kan jeg laste opp omtrent hva jeg enn måtte ønske.

     

    Annbefaler å enten validere bildet i et lignende script, eller buke klassen min istedenfor move_uploaded_file(),

     

    Hele poenget med klassen jeg har laget er å erstatte move_uploaded_file() med en metode som utfører den samme jobben, men også

     

    Lager thumbnail

    Resizer hovedbildet

    Legger til tekst/logo i nederste venstre hjørne

    Hånterer mappe adresser

    Validerer at bildet er ek etke bilde og ikke overstiger en gitt størrelse i både piksler og bytes

  7. Til dere andre: Hva med $_SERVER['REMOTE_HOST']? Er det noe som forandrer seg hver gang en logger inn på et abbonement med dynamisk IP?

    5540242[/snapback]

     

    REMOTE_HOST er en relativt lei løsning, den trenger spesiell konfigurasjon.

     

    Er du ute etter hosten kan du bruke denne:

    http://no.php.net/manual/en/function.gethostbyaddr.php

     

    da $_SERVER utgaven kun henter ut apache sin, som sjeldent er konfigurert inn.

     

    Hostname er så vidt jeg vet en kombinasjon av ipadressen din, og netlerendøren.

     

    slik så min ut fra gethostbyadress()

     

    ***-***-**.****.adsl.tele2.no

     

    der de første siffrene adskilt med - er de siste 3 punktene i ip adressen min.

  8. et eksempel på et login script:

     

    <?php
    session_start(); // start session
    
    
    class minsql{
    var $hostname = 'localhost';
    var $username = 'root';
    var $password = '';
    var $db = 'mindb';	
    
    function sql(){
     return mysql_connect($this->hostname, $this->username, $this->password);
    }
    
    function getDB(){
     return $this->db;	
    }
    }
    
    $conn =  new minsql();
    //Valider Brukernavnet
     if(preg_match('@^[a-zæøå0-9_-]+$@i', $_POST['brukernavn'])){
     	$username = $_POST['brukernavn'];	
     } else {
     	die("Ugyldig brukernavn, kan kun inneholde tegnene a-å, 0-9 samt - og _");	
     }
    //valider passordet  
     if(preg_match('@^[a-zæøå0-9_-]+$@i', $_POST['passord'])){
     	$username = $_POST['passord'];	
     } else {
     	die("Ugyldig passord, kan kun inneholde tegnene a-å, 0-9 samt - og _");	
     }
    //Lag en sql spørring
     $sql = "SELECT * FROM gb_admin WHERE username='$username' AND password='$passord'";
     $result = mysql_query($sql, $conn);
     
     if(!$result){
     	echo "Ingen med dette brukernavnet/passsordet ble funnet i databasen";	
     }
    //sjekk om en bruker ble funnet  
     if(mysql_num_rows($result) == 1){
     	$info = mysql_result($result, 0);
    //Bruker funnet, set sessions  	
     	$_SESSION['userid'] =  $info['id'];
     	$_SESSION['brukernavn'] = $info['brukernavn'];
     } else {
     	echo "Ingen med dette brukernavnet/passsordet ble funnet i databasen";	
     }
    //Lukk mysql koblingen  
     mysql_close($conn);
     
    ?>
    
    

     

    Husk alltid å validere input fra forms, spesielt når de sendes til en sql spørring. ALDRI direkte overfør variabler fra form til spørringer...

  9. Om det er lenge siden du drev med dette er det ikke rart du blandet, register_globals var nemlig standard som 'on' før. husker selv da jeg første gang oppgraderte phpen min til en version med standard off :S

     

    er å annbefale å bruke enten tilhørende superglobal etter hvor du henter verdien fra( $_GET, $_POST, $_COOKIE ) eventuelt kan du bruke $_REQUEST om inneholder dem alle ;)

  10. lasso. du har en liten feil i syntaxen på Regexpen din, du må escape \ ellers escaper du ]

    Mulig derfor du ikke finner fila på serveren din.

    Beklager at jeg glemte disse tegnene.

     

    valid() sjekker filstørrelsen, og sikrer at filnavnet ikke inneholder ulovlige tegn. det som nå er tillatt er:

     

    \ / . a-æ 0-9 _ og - (ja, den er case-INsensitiv, merk 'i' etter siste @ )

     

    <?php
    function valid($fil){
    $max_file_size = '10';
    if(preg_match('@^[a-zæøå0-9\._-/\\]+\.txt$@i', $fil)){
      if(filesize($fil) < $max_file_size){
         return true;
      }
      return false;
    }
    return false;
    }
    ?>
    

     

    Nei, den sjekker ikke innholdet. Om filens innhold skal skrives rett til skjerm, husk å bruke htmlentities() eller htmlspesialchars() på innholdet før det sendes til output. Ganske vesentlig for å hindre fol i å legge inn javascript i tekstfilen(tviler på at dette er ønskelig)

  11. Dette scriptet er fremdeles usikkert. jeg kan helt fint laste opp akkurat hva jeg vil. MAX_FILE_SIZE er ingen garanti, dessuten kan jeg jo bare lage meg min egen form å hoste den lokalt.

     

    du kan bruke noe slikt:

     

    <?php
    
    session_start();
    
    require_once("config.php");
    
    function valid($fil){
     $max_file_size = '10';
     if(preg_match('@^[a-zæøå0-9_-]+\.txt$@i', $fil)){
       if(filesize($fil) < $max_file_size){
          return true;
       }
       return false;
     }
     return false;
    }
    
    $navn=$_SESSION["navn"];
    $pass=$_SESSION["pass"];
    $sql=mysql_query("SELECT id FROM bruker WHERE navn = '$navn' AND pass = '$pass'");
    if(mysql_num_rows($sql) == 1){
    $uploaddir = '/var/www/xxxxx/xxxx/xxxxx/uploads/';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
    
    echo '<pre>';
    if(valid($_FILES['userfile']['tmp_name']) == true){
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
     echo "File is valid, and was successfully uploaded.\n";
    } else {
     echo "Possible file upload attack!\n";
    }
    }
    echo 'Here is some more debugging info:';
    print_r($_FILES);
    print "</pre>";
    }
    else {
    echo "du må logge inn!";
    }
    ?>
    

     

    ved hjelp av filesize() og preg_match har vi nå sikret oss at filen ikke er større enn 10kb og at den inneholder kun a-å 0-9 - eller _ og slutter på .txt

     

    valider alltid input!

  12. $sql = "SELECT * FROM [tabellnavn] WHERE [navnefelt-navn]=$'navn'";
    $resultat = mysql_query($sql) or die("Feil i spørring: $sql <br>".mysql_error());
    $ant_funnet = mysql_num_rows($resultat); //Antall funnet med det navnet
    if($ant_funnet>0) {
      $navn = $rad['Brukarnavn'];
       $brukar = $_POST['navn'];
       $pass = $_POST['pass'];
      echo "Du er logget inn med navnet ".$navn;
    }
    else {
      echo "Navnet $navn ble ikke funnet i databasen";
    }
    

    f.eks.

    Bytt ut det inni [] med dine verdier.

     

    Forøvrig så anbefaler jeg deg å lese litt mer om php/mysql. Lag små script som du utvider etterhvert, slik at du lærer det skikkelig, før du begynner å lage noe til websider.

    5528483[/snapback]

     

    Vil bare påpeke at du ikke validerer input, her kan vemsomhelst logge deg inn.

     

    om jeg logger meg inn med

    ' OR 1='1

    som brukernavn vil jeg automatisk bli logget inn som den første brukeren mysql_fetch_array finner.

     

    Søk på sql-injections på google. Dette kan hjelpe deg en hel masse.

    Fjern ale

    < > = , . ' "

    fra brukernavn og passord før du sender det til $sql spørringen din

     

    dette kan gjøres med opptil flere metoder. f.eks preg_match(), htmlentities(), htmlspesialchars() etc

  13. Du kan lagre bilder i mySQL, men kansje ikke å annbefale, spørs helt hvor stor database du har tilgang til.

     

    Du kan eventuelt også bare gjøre som foreslått med lagring av navnet på bildet i en database, jeg ville nok ha lagt til en ekstra kolonne med navn på fila istedenfor å laste opp alle bilder på serveren med id som navn.

×
×
  • Opprett ny...