NH
-
Innlegg
190 -
Ble med
-
Besøkte siden sist
Innholdstype
Profiler
Forum
Hendelser
Blogger
Om forumet
Innlegg skrevet av NH
-
-
er det koden gjør. du må bare spesifisere linje idn. Om du ønsker hjelp, legg med all vital info. i dette tilfellet er databasestruktør et must om du ønsker et ferdig script, du burde være i stand til å endre det jeg oppga deg...
-
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.
-
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...
-
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"; } } ?>
-
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); ?>
-
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
-
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.
-
Er det snakk om bildeopplastning har jeg laget en klasse du kan bruke, selve navngivnings sekvensen må du ordne på egenhånd, men burde ikke by på problemer.
http://norskwebforum.no/viewtopic.php?p=169105#169105
(jeg er Nic0 ifra NWF)
annbefaler deg å ta en titt på denne da den vil løse de fleste problemer ved et bilde upload script.
-
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...
-
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
-
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)
-
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!
-
$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.
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
-
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.
hjelp til å stoppe hacker
i Programmering og webutvikling
Skrevet
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.