Avatar billede Simon Praktikant
07. februar 2007 - 20:10 Der er 11 kommentarer og
1 løsning

Begrænset adgang for uploaded billede

Jeg har lavet en webside hvor man kan logge ind, og herefter uploade et billed.
Billedet gemmes på serveren, og kan vises på siden.

Men billedet kan dog også tilgås fra en browser med dets direkte adresse på serveren.

Hvad skal der til for at dette ikke er muligt. Men at det kun er den som er logget ind som kan tilgå billedet?
Avatar billede jokkejensen Novice
07. februar 2007 - 20:19 #1
Jeg er ikke skide go til C#.. men jeg har lavet følgende, som sender et billede til folk der ikke er logget ind, som har session[user] == null..

ellers henter den fra databasen, skalerer billedet efter querystrengen, og sender det..

jeg har så lavet noget url rewriting.. så jeg kalder mine billeder med:

<img src="/img/[højre]/[bredde]/[database id]/etellerandet.jpg" />

Jeg bruger følgende :

using System;
using System.Collections.Generic;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using Modeltypes.Util.Sql;
using Image=System.Drawing.Image;

public partial class Controls_Core_ImageControl : System.Web.UI.Page
{
    Bitmap bm;
    protected void Page_Load(object sender, EventArgs e)
    {
        if(Session["User"] == null)
        {
            bm = new Bitmap(Server.MapPath("~/Files/Themes/Default/SystemImages/noHotLink.jpg"));
            bm.Save(Response.OutputStream, ImageFormat.Jpeg);
            bm.Dispose();
            Response.End();
        }
       
        Database DB = new Database();
       
        List<SqlParameter> sqlParam = new List<SqlParameter>();
        sqlParam.Add(DB.SqlParam("@pictureID", pictureID.ToString(), SqlDbType.Int));
       
        DataTable dt = new DataTable();

        dt = DB.getDataTable(Stored_Procedures.System_GetImage, sqlParam);
       
        if(dt.Rows.Count > 0)
        {
            bm = new Bitmap(Server.MapPath("~/Files/Users/" + dt.Rows[0]["bookingnr"].ToString() + "/" + dt.Rows[0]["Filename"]));

            bm = ImageHandler.FixedSize(bm, width, height);

            bm.Save(Response.OutputStream, ImageFormat.Jpeg);
            bm.Dispose();
            Response.End();
        }
        else
        {
            //Billedet eksisterer ikke i DB
        }
    }
   
    private int width
    {
        get
        {
            int i = Convert.ToInt32(Request.QueryString["width"]);
            int j = ImageHandler.maxWidth;
            if(i < j)
                return i;
            return j;
        }
    }

    private int height
    {
        get
        {
            int i = Convert.ToInt32(Request.QueryString["height"]);
            int j = ImageHandler.maxHeight;
            if (i < j)
                return i;
            return j;
        }
    }

    private int pictureID
    {
        get
        {
            return Convert.ToInt32(Request.QueryString["pictureID"]);
        }
    }
}


du skal altså bare bruge det der står inde i if(Session["User"] != null) og smide en else på der gemmer det korrekte billede i response'en..

sig til hvis det driller
Avatar billede arne_v Ekspert
07. februar 2007 - 20:28 #2
hvis billedet serves direkte af IIS, så er adgangen jo ikke styret af ASP.NET d.v.s.
at det er IIS config du skal ind i

hvis billedet serves fra en ASP.NET page så kan du styre det
Avatar billede Simon Praktikant
07. februar 2007 - 21:03 #3
Tak til jokkejensen for forslaget. Jeg kan ikke lige helt gennemskue det, og hvorfor adgangen skulle være begrænset.

Til arne_v: Hvad mener du med at 'billedet serves fra ASP.NET'?
Jeg har en ASP.NET webserver som genererer siden som billdet vises på.

I sidste ende hentes billedet jo ved et HTML-tag:
<img id="billedID" src="images/mit_billede.gif"/>

Og i så fald kan man vel altid hente billedet direkte ved at bruge samme adresse som der hvor html siden får billedet fra. Eller er jeg helt galt på den?
Avatar billede arne_v Ekspert
07. februar 2007 - 21:10 #4
"billedet serves fra ASP.NET" er det som jokkejensen ogsaa beskriver

ikke

<img id="billedID" src="images/mit_billede.gif"/>

men

<img id="billedID" src="imagefetcher.aspx?img=mit_billede.gif"/>

fordi imagefetcher.aspx kan checke om man er logget ind
Avatar billede Simon Praktikant
07. februar 2007 - 21:23 #5
Hvis jeg har forstået jer ret, så henter man altså ikke billedet direkte, men indirekte gennem imagefetcher.aspx, som ikke returnerer en html-side men et billede. Og det gør den så med:
'bm.Save(Response.OutputStream, ImageFormat.Jpeg);'
Avatar billede snepnet Nybegynder
08. februar 2007 - 21:31 #6
Hvis du benytter asp.net 2.0, og har din app. liggende på en 2003 server med IIS6.0, kan du bare sætte beskyttelse på folderen på helt almindelig vis - f.eks. kun give adgang til brugere der er logget ind.
Mvh
Avatar billede Simon Praktikant
09. februar 2007 - 19:52 #7
Snepnet: Jeg har ikke adgang til at kunne konfigurere min server selv da det er ved et webhotel. Jeg har ftp-adgang til at uploade min application, og en enkelt database at arbejde med.

I øvrigt bruger jeg Session-variabler til at holde styr på login. Ville dette i så fald kunne køre sammen med det du omtaler
Avatar billede Simon Praktikant
10. februar 2007 - 19:59 #8
Til jokkejensen

Med baggrund i dit fine eksempel har jeg nu fået det til at virke. Hvis du smider svar får du point.
Avatar billede Simon Praktikant
19. februar 2007 - 09:30 #9
Jokkejensen vil du smide et svar, så får du point. Endnu en gang, tak for hjælpen.
Avatar billede snepnet Nybegynder
19. februar 2007 - 23:11 #10
Benytter du det indbyggede login-system - eller har du lavet dit helt eget?
Mvh
Avatar billede Simon Praktikant
21. februar 2007 - 11:53 #11
Jeg har lavet mit eget. Jeg syntes at det virkede mere simpelt.
Avatar billede Simon Praktikant
14. maj 2007 - 11:36 #12
lukker spm
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

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