Avatar billede deadkennedy Nybegynder
23. juli 2006 - 18:52 Der er 17 kommentarer og
1 løsning

Nyhedssystem tilpasses firefox

Goddag.

Jeg har længe søgt svar på følgende problem, desværre uden resultat. Jeg forsøger nu her, da jeg ved dets opdagelse fik opfattelsen af en meget mere dybdegående, professionel besvarelse.

Eksperter;

- Jeg anvender et nyhedssystem, der kræver billedtilføjelse for oprettelse af nyhed. Dette fungerer efter hensigten i Internet Explore, men en fejludskrift forekommer i Mozilla Firefox, om at forkert filformat er anvendt, og nyheden oprettes ikke.(dette opstår ved jpg samt png)

- Derfor er mit spørgsmål, hvorledes dette rettes.

Jeg takker mange gange på forhånd for enhver form for indsats, da dette er et handlings hindrende problem.

Jeg benytter følgende kode til at gemme nyheden:

<head>

<title>Gem artikel</title>
<link rel="stylesheet" href="../stylesheet.css" type="text/css">

</head>


<body rightmargin="0" leftmargin="4" topmargin="3" bottommargin="0">

<?
session_start();
if (!isset($_SESSION['laccess']) && $_POST['referer'] != 'login') {
    header("Location: index.php?f=needlogin");
    exit;
}

$ok=0;
if($_FILES["image"]["name"]) {
$size = $_FILES["image"]["size"] / 1024;
if($size > 0 && $size < 1023) {
$fra = $_FILES["image"]["tmp_name"];
$fra2 = $_FILES["image"]["name"];
$tilp = $_FILES["image"]["type"];
$tiltype = strstr($_FILES["image"]["type"],"/");
$tiltype = substr($tiltype,1);
if ($tiltype == "bmp" || $tiltype == "gif" || $tiltype == "pjpeg" || $tiltype == "x-png") {
$tiltype = str_replace("x-png","png",$tiltype);
$tiltype = str_replace("pjpeg","jpg",$tiltype);
$til = "billeder/".time().rand(0000,9979)."-".$fra2;
if(function_exists("move_uploaded_file")) {
move_uploaded_file($fra, $til);
$img = "$til";
$ok=1;
} else {
copy($fra, $til);
$img = "$til";
$ok=1;
}
}else {
$fejl = 'Forkert fil-format!';
}
}else {
$fejl = 'Den tilføjede fil er over 1 MB!';
}
}else {
$fejl = 'Ingen fil fundet!';
}

if ($ok) {
$dato = date('d/m/Y');
$kl = date('H:i');
$overskrift = $_POST[overskrift];
$forfatter = $_POST[forfatter];
$nyhed = $_POST[nyhed];
include("../config.php");
mysql_query("INSERT INTO nyheder_avis (dato, overskrift, forfatter, image, nyhed) VALUES ('$dato', '$overskrift', '$forfatter', '$img', '$nyhed')") or die(mysql_error());
echo("Nyheden er tilføjet");
}
else {
echo "Kunne ikke tilføjes Pga: ".$fejl;
}
?>
<br><br><a href='../nyheder/tilfoej.php'>Tilbage</a>
Avatar billede erikjacobsen Ekspert
23. juli 2006 - 19:08 #1
Du skal sikkert bare tilføje

if ($tiltype == "bmp" || $tiltype == "gif" || $tiltype == "pjpeg" || $tiltype == "x-png" || $tiltype == "jpeg" || $tiltype == "png") {
Avatar billede deadkennedy Nybegynder
23. juli 2006 - 19:20 #2
Mange tak ! :D
- Problemet er løst, er utrolig glad for dette, har brugt timer på undersøgelse af en løsning.

For fremtiden vil jeg udelukkende benytte mig af denne side, mange tak til dig!
- Hvordan godkender jeg dit svar?
Avatar billede erikjacobsen Ekspert
23. juli 2006 - 19:39 #3
Jeg samler slet ikke på point, tak. Svar selv, accepter eget svar.

Browserne har lidt forskelligheder i hvad de sender med som filtype. Hvis du får problemer igen, så skriv filtypen ud.
Avatar billede deadkennedy Nybegynder
23. juli 2006 - 20:16 #4
Fantastisk, tak skal du have :)
Avatar billede mclemens Nybegynder
24. juli 2006 - 00:44 #5
ADVARSEL du har et hul i scriptet og det er meget alvorligt ... du skal validere på selve navnet filen har og ikke det browseren siger filen har som type / mimetype ... jeg har lige testet lokalt og jeg kan sagtens uploade en php fil (alle filer for den sags skyld) med den nuværende validerings måde ...

(tidligere bug rettet script: http://tech.tailoredweb.com/simple-upload-53.php?forum=simpleupload&func=read&page=4&id=188
- på opfordring fra: http://www.hol.dk/traad.asp?fID=6&tID=326206 )

... du SKAL validere på extension angivet i ["name"] du MÅ IKKE bruge ["type"]
- man må aldrig stole på hvad browseren påstår ... stol på hvad extension serveren rent faktisk siger at filen har ... jeg kan desværre ikke uddybe dette mere - da der er nogle der vil få en viden som ikke er god for alle at have ... men check de to links hvis du tvivler lidt på det jeg siger her ...

- altså istedet for at validere på det der kommer efter / i type
så skal du validere på det der kommer efter . i name angivelsen da det er det filnavn som filen rent faktisk har ...

Mvh, Clemme ;o)
Avatar billede mclemens Nybegynder
24. juli 2006 - 00:50 #6
For at forklare hvor alvorligt hullet rent faktisk er så kan alle php kommandoer udføres med lidt viden om hvordan man laver hullet og det kan føre til alt fra defacing til sletning af hele websitet - afhængig af hvilken idiot der opdager hullet ... så altså et meget alvorligt hul ...
Avatar billede mclemens Nybegynder
24. juli 2006 - 10:14 #7
En ting mere din sql er også hullet ... check evt dette:
http://dk.php.net/manual/da/security.database.php

... men selvfølgelig hvis du har udpeget folk du har tiltro til er hullet i upload og hullet i mysql ikke af stor betydning ... dog kan et kodeord opsnappes / gættes og så kan hullet herefter udnyttes ... Hullet i håndteringen af mysql post håndteringen består i at dataerne ikke er beskyttet af mysql injection ... mysql real escape string anbefales :o) http://dk.php.net/manual/da/function.mysql-real-escape-string.php
Avatar billede deadkennedy Nybegynder
24. juli 2006 - 16:51 #8
Mange tak for det !
- Er meget glad for din indsigt i dette problem, det sætter jeg stor pris på.
Da jeg langt fra mestrer php til fulde, tvivler jeg på at kunne tilrette dette, men er glad for at nogen gjorde opmærksom på det.
Jeg købte dette system af en såkaldt programmør, men det viste sig senere at være så fyldt med fejl at jeg skulle bruge mange timer på at tilpasse det.

- Er det nødvendigt at rette, hvis de folk der har adgang til systemet 100% ikke ville udnytte det ? , eller kan det ske udefra ?
Hvordan kan du se min SQL ?
Avatar billede mclemens Nybegynder
24. juli 2006 - 18:53 #9
[ - Er det nødvendigt at rette, hvis de folk der har adgang til systemet 100% ikke ville udnytte det ? ] ... Tjah, det afhænger lidt ... Hvis nu du har givet f.eks. 2 personer adgang til systemet så er der minimal risiko for at et kodeord på et tidspunkt skulle lække ... men, ok lad os så tage et scenarie hvor du har 50 skribenter/brugere tilknyttet:

Den ene bruger sidder på en netcafe/skole/bibliotek, hiver sedlen frem med hans kodeord og lægger den på tastaturet indtaster koden og logger ind ... nu er der så mulighed for 2 huller ...
1. Lige inden brugeren satte sig ved pc'en har en bruger indstalleret noget skidt software på maskinen der overvåger og indsamler kodeord.
2. Brugeren glemmer sedlen der lægger på tastaturet og har skrevet domænenavnet på samme seddel

Brugeren sidder derhjemme men hans pc er desværre inficeret han logger ind og kodeordet videresendes til bagmændene bag inficeringen

...

...

Når nu der er kommet adgang til siden går brugeren så igang med at finde et hul ... hvis der er et hul af denne type kan det få katastrofale følger ... men, hvis hullerne er lukket kan brugeren kun foretage sig det en skribent normalt kan ... burde typsisk være:
1. Oprette en masse trals spam tråde der skal slettes
2. Slette de tråde der er oprettet af samme skribent.
3. slette alle tråde fra hvilken som helst skribent (er normalt ikke noget en hvilken som helst skribent kan / bør kunne ... kun en skribent med master rettigheder til det selvfølgelig)

... Så hvis man vil være lidt mere på den sikre side så bør og skal man rette det (altså både mysql hullet og upload hullet) ...



[ eller kan det ske udefra ? ]
- Tjah, der kan være flere huller f.eks. i håndteringen af sessions og håndtering af mysql værdier på andre sider...
Men, hvis alt andet er iorden, brugerne og deres omgangskreds der måske kan komme til at "låne" kodeordet er troværdige samt meget påpasselige med kodeordet og globals er off - så kan jeg ikke lige pege på noget der giver et hul ind udefra ... men som sagt hele siden er jo ikke i ovenstående kode ... så mon ikke din programmør skal have skældt ud? ... husk dog at kontakte selve firmaet istedet for koderen direkte og henvis evt. til denne tråd - de bør rette det her for dig hvis du har betalt noget for det ... ellers bør du have noget eller en del af dine penge tilbage, hvis de ikke kan lukke hullet ... men hullet er let / bør være let nok at lukke så det bør ikke være et problem for dem (har ikke lige tid til at rette det for dig lige nu - familie besøg)... Det er som sagt validering på godkendte fil extensions og en beskyttelse mod sql injections...


[ Hvordan kan du se min SQL ? ] Databasens struktur ser meget fin ud og fylder heller ikke for meget. Jeg synes måske ikke at de kodeord det står derinde er særlig originale og de burde måske være på mere end max. 8 tegn ... ... ... ... Ej, driller dig bare ;o) - Jeg holder mig altid på den rigtige side så jeg ved kun det du har skrevet her :) Det jeg mente med din sql var det du skrev i spørgsmålet:

mysql_query("INSERT INTO nyheder_avis (dato, overskrift, forfatter, image, nyhed) VALUES ('$dato', '$overskrift', '$forfatter', '$img', '$nyhed')") or die(mysql_error());

^ - Problemet er her at du benytter post værdier direkte i din mysql forespørgsel ... De bør beskyttes med det jeg linker til i 24/07-2006 10:14:33 ... Nu er jeg kun selvlært koder (ikke uddannet), men jeg kan dog se to huller i denne korte kode ... Gør firmaet opmærksom på disse to fejl, de ved måske ikke at deres koder sætter kundernes sikkerhed lavest! Eller måske kan du få et afslag når du har påpeget hans sikkerhedsfejl?


... Jeg har som sagt familie visit og har ikke lige tid til at pille ved det idag (måske sent i aften eller engang i løbet af imorgen får jeg tid til det ... men hæng mig ikke lige op på den) ... men det kan jo være at der er en anden der har tid til lige at strippe navnet på filen og checke på et array og så fjerne escaping i variablen med stripslashes (afhængig af magic quotes)og bruge mysql real escape string istedet ... ellers så må du hænge ud :o)


Mvh, Clemme :)
Avatar billede deadkennedy Nybegynder
24. juli 2006 - 22:41 #10
Mange tak!

Jeg håber du vil få tid til at rette dette.
- Programmøren har forlængst nægtet at forbedre de åbenlyse fejl.

Utrolig viden, tak for at berige os andre / mig med den.
Avatar billede mclemens Nybegynder
25. juli 2006 - 02:32 #11
Sovetid ...








<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>Gem artikel</title><link rel="stylesheet" href="../stylesheet.css" type="text/css"></head><body>





<?php

/* Bemærk i nedenstående står der kommentarer adskilt af /* og */

/* Disse kommentarer kan fjernes - Start /* og slut på linjerne */

/* skal bare fjernes sammen med kommentarerne
... det er kun for at dokumentere kodningen lidt */





/* Angiv antal kb. filen maximalt må have her ... ikke nogle kb
eller mb angivelser efter tallet... eks. 1024 giver max upload 1 mb ... */
$maxfilesize=1024;





/* Skriv de filtyper der er tilladt: */
$filtyperok=array("jpg","jpeg","gif","png","tif","tiff","jpe","bmp");






/* Sti til mysql configuration */
$mysqlconf="../config.php";





/* Angivelse af destinations sted p.t.
(billeder/)
(kontant-udvidende-tids-angivelse)
(samt-tilfældigt-mellem-0-og-9979)
(efterfulgt-af-bindestreg)
(-og-så-kommer-filnavnet-tilsidst)
... filnavn tilføjes automatisk nede i scriptet */
$til = "billeder/".time().rand(0,9979)."-";





/* Opstart af sessions */
session_start();





/* Adgangs kontrol baseret på session værdier */
if(!isset($_SESSION['laccess'])){
  header("Location: index.php?f=needlogin");exit;
}

/* Bemærk ovenstående linje: if(!isset($_SESSION['laccess'])){
var tidligere: if(!isset($_SESSION['laccess']) && $_POST['referer']!='login'){
... dog vil man kunne "bryde igennem" session sikkerheden (umiddelbart ved analysering af scriptet) ved blot at poste direkte med en post værdi hvor referer sættes til login med en hjemmelavet post formular - derfor har jeg rettet denne linje ... men muligvis  skal den rettes tilbage afhængig af anden kodning på resten af sitet ... men det er som sagt et hul når jeg lige analyserer ... */





/* Check på om en upload er accepteret ...
- Men jeg har lige ændret det lidt ...
P.t. er den defineret til false ...
Hvis scriptet ikke finder fejl uploades der */
$fejl=false;





if(isset($_FILES["image"])){ /* Check om der er et image klar til håndtering *fejl1 */

  $size=$_FILES["image"]["size"]/1024; /* Angivelse af fil størelse i kb */

  if($size > 0 && $size < $maxfilesize){ /* Check om fil fylder mere end 0 eller mere end maks fil størrelse *fejl2 */

    $fra=$_FILES["image"]["tmp_name"]; /* Tmp placering på serveren */
    $fra2=$_FILES["image"]["name"]; /* Navn filen siges at have */
    $til=$til.$fra2;
    $filext=preg_replace("@.*\.@","",$fra2);

    if(in_array($filext,$filtyperok)){ /* Check om filtype må uploades *fejl3 */

      if(!function_exists("move_uploaded_file")||!move_uploaded_file($fra,$til)){
        if(!function_exists("copy")||!copy($fra, $til))$fejl="Upload ikke muligt kontakt administrator!";
        /* ^ - Fejl hvis hverken move eller copy er tilgængelig */
      }
     
    /* Fejl tekst hvis fil format ikke var tilladt *fejl3 */
    }else $fejl="Fil formatet var forkert!";

  /* Fejl tekst hvis der billedet er for stort *fejl2 */
  }else $fejl="- Den tilføjede fil er størrer end ".round($maxfilesize/1024)." mb!";

  /* 2 Alternative forslag til ovenstående tekst linje:
  }else $fejl="- Den tilføjede fil er størrer end ".(number_format(($maxfilesize/1024),2,",","."))." mb!";
  }else $fejl="- Den tilføjede fil er størrer end ".$maxfilesize." kb!";*/

/* Fejl tekst hvis der ikke er et image klar til håndtering *fejl1 */
}else $fejl="- Der blev ikke fundet nogen fil til upload!";





function quote_smart($value){ /* http://dk.php.net/manual/da/function.mysql.real.escape-string.php , eksempel 3 ;o) */

  if(get_magic_quotes_gpc())$value=stripslashes($value);

  if(!is_numeric($value))$value="'".mysql_real_escape_string($value)."'";

  return $value;
}





/* Fejl hvis overskrift, forfatter og nyhed ikke er sat */
if(!isset($_POST["forfatter"])||!isset($_POST["overskrift"])||!isset($_POST["nyhed"]))$fejl="- Forfatter, overskrift og nyhed skal findes ved postning!";





if(!$fejl){ /* Check om fejl er false ... altså at der ikke er nogen fejl ... */

include($mysqlconf);

$dato=date('d/m/Y'); /* dato: DD/MM/YY */
$kl=date('H:i'); /* kl, HH:MM <- Den har ikke noget formål i scriptet sådan set ??? den bør nok slettes ??? */




$query=sprintf("INSERT INTO nyheder_avis (dato, overskrift, forfatter, image, nyhed) VALUES (%s,%s,%s,%s,%s)",$dato,quote_smart($_POST["overskrift"]),quote_smart($_POST["forfatter"]),quote_smart($til),quote_smart($_POST["nyhed"]));



mysql_query($query) or die(mysql_error()); /* Sæt evt. // i starten af denne linje for at undgå mysql forsespørgsel */

// echo $query; /* Fjern evt. // i starten af denne linje for at outputte hvad den bruger som query */


/*$_POST[forfatter];
$_POST[nyhed];
*/
  echo"Nyheden er tilføjet";

}else echo"Upload af filen slog fejl grundet:<br>".$fejl;

?>

<br><br><a href="../nyheder/tilfoej.php">Tilbage</a>

<br><br>Midlertidig test form...<br>
<form method="post" enctype="multipart/form-data" action="1.php">
<input type="file" name="image">
<input type="text" name="forfatter" value="forfatter">
<input type="text" name="overskrift" value="overskrift">
<input type="text" name="nyhed" value="nyhed">
<input type="submit" value="ok">
</form>



</body></html>
Avatar billede mclemens Nybegynder
25. juli 2006 - 02:33 #12
hov. jeg kaldte forresten test filen for 1.php jævnfør den testformular jeg brugte...
Avatar billede deadkennedy Nybegynder
26. juli 2006 - 00:39 #13
Mange tak ! - Havde ikke regnet med en så dybdegående besvarelse, utroligt!
Avatar billede mclemens Nybegynder
26. juli 2006 - 01:30 #14
Velbekom :)
Avatar billede mclemens Nybegynder
26. juli 2006 - 12:19 #15
P.s. denne del nær bunden kan du godt slette ... det var en rest fra
konverteringen jeg glemte at slette da jeg havde overført det hele:

/*$_POST[forfatter];
$_POST[nyhed];
*/
Avatar billede deadkennedy Nybegynder
26. juli 2006 - 21:24 #16
Tak!
Avatar billede webco_dk Nybegynder
28. juli 2006 - 20:10 #17
det virker fint nu. jeg ska bare lige tilpasse det let og få til at sende billed navn til en mysql database men det skulle jeg nok selv kunne klare. mange tak for din hjælp
Avatar billede webco_dk Nybegynder
28. juli 2006 - 20:11 #18
hov det ^ skulle ikk stå i denne tråd undskyld
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester