Declareren van variabelen

Status
Niet open voor verdere reacties.

weswillem

Gebruiker
Lid geworden
8 nov 2011
Berichten
310
Waar en op welke wijze declareer ik een variabele die ik door het het hele project kan gebruiken? Bv. beheerder = true. Gebruik nu vb2010. Ik heb zelf het idee in een module, maar dat gaat fout. Misschien anders omschrijven? Wie geef me een hint zodat ik verder kan.
 
Hoi,

Dan maak je hem public:
[CPP]Public Class Form1

Public Beheerder As Boolean = False

End Class
[/CPP]

Om hem dan vervolgens vanuit een andere class wil gebruiken, gebruik je dit: "Form1.Beheerder".

MartinJM
 
waar je naar op zoek bent is de "scope" van een variabele.
Hoe hoger in de structuur je een var definieert hoe langer hij blijft bestaan. (voordat hij naar de carbage collector gaat)
ik weet niet of je stand alone applicaties maakt of webbased. The werkwijze met variabelen is daarin namelijk erg verschillend.
Soms kun je op een hoger niveau wel een variabele aanmaken maar daar niet gelijk definiëren. Dat kan dan in een latere routine.
 
@SmartThinker
Ik maak een standalone applicatie. Ik ben geen expert, maar uit hobbyisme
Wat ik mij nog kan herinneren is dat ik iets in een module kon declareren en dan door het hele
project kon meenemen.
Nu heb ik in vb2010 een loginscherm foirm ge-add. Als de inlog correct is en het is de beheerder
dan wil ik die variabele gebruiken in een ander form of forms.
 
Hoi,

In mijn vorige post kan je vinden hoe dat zou moeten, maar ik betwijfel of het wel een veilige manier is. Het is niet echt heel erg moeilijk om variablen binnen een programma aan te passen (als iemand die geen beheerders rechten heeft het wel wil krijgen)...

MartinJM
 
Laatst bewerkt:
Martin
Ik heb nu een spashscreen toegevoegd en in vb2010 kan je ook een loginscherm adden.
Ik kijk dan of gebruikersnaam en wachtwoord gelijk zijn, als een beheerder inlog en de gegevens
komen overeen dan is beheerder=True. Vervolgens komt het mainscherm te voorschijn en moet
de button Bewerken aan staan, anders niet.
Dus zodra ik de Beheerder true is en ik in het mainscherm kom codeer ik dan toch
if Beheerder(true) then
else
........
end if
Vraag me af waar ik dit dan neer moet zetten.
 
als het gaat om rechten kun je vaak beter een keer te vaak controleren op rechten dan vanuit een global aannemen dat ze die rechten hebben.
Ik controleer (web based) constant rechten om er zeker van te zijn dat een verkeerde persoon geen kans krijgt om vars te zetten in de verkeerde mode.
 
Hoi,

Ik heb een kleine uitleg geschreven waarom het onveilig is:

Stel je hebt een klein programma wat opslaat of er een gebruiker ingelogd is of niet in een boolean:
Form1:
[CPP]Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If TextBox1.Text = "Beheerder" Then
Form2.Beheerder = True
Form2.ShowDialog()
ElseIf TextBox1.Text = "Gebruiker" Then
Form2.Beheerder = False
Form2.ShowDialog()
End If
End Sub
End Class
[/CPP]
Form2:
[CPP]Public Class Form2

Public Beheerder As Boolean = False

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Beheerder = True Then
MsgBox("Beheerders rechten!")
Else
MsgBox("Geen beheerders rechten!")
End If
End Sub
End Class[/CPP]

Dan open je het programma, start je een 'hack'-programma op en ga je op zoek naar de geheugenplek die bijhoudt wat de waarde van 'Beheerder' is. Dat kost wat moeite, maar in mijn geval was dat adres "02925178". Als ik dan inlogde als "Gebruiker" en die geheugenplek van 0 naar de 1 veranderde, 'dacht' het programma dat ik een beheerder was.

Kijk maar:
GeenBeheerder.PNG
Beheerder.PNG
(Ik heb de waarde aangepast in het achtergrond programma en ondertussen geen codes aangepast. Je zal me daarvoor op mijn woord moeten geloven.)

Ik hoop dat ik duidelijk heb gemaakt wat ik bedoelde. Het komt erop neer dat alleen een boolean om bij te houden dat iemand wel of geen beheerder is vrij makkelijk te omzeilen is... Deze truc werkt (denk ik) niet als je gewoon verschillende forms hebt voor beheerders en 'normale' gebruikers. Dan nog steeds zullen er wel manieren zijn om het te omzeilen, maar die zijn dan waarschijnlijk wel al ingewikkelder.

MartinJM
 
@SmartThinker: Dank je!

Overigens is dit niet de enige manier waarop ongeautoriseerde toegang verkregen kan worden, maar in het geval van een boolean zou ik zeggen dat dit een van de makkelijkere is.

Ik ken nog twee andere manieren:
1. De VB.NET code terug zien te halen met een programma. Dit werkt nooit helemaal goed dus dan moet je eerst nog eens de code werkend krijgen voordat je hem kan manipuleren.
2. De assembly aanpassen. Dat kan wel, maar het enige programma wat ik ken dat dat kan is ook een debugger, en dus ook (met de goede code) op te sporen zodat je programma meteen afsluit. Ook dat zal overigens wel weer te omzeilen zijn, maar dan kost het toch wel erg veel moeite.


Dat zijn dan trouwens ook nog alleen de manieren (nogmaals, die ik ken) om het programma te veranderen zodat het doet wat je wil. Je zal ook nog het wachtwoord goed beveiligd moeten opslaan zodat ook dat niet te kraken valt.

Al met al: een inlog script is veel moeilijker(/ingewikkelder) dan het lijkt ;)

MartinJM
 
Laatst bewerkt:
@martinJM klopt.
Daarom zet ik in mijn programma's nooit wachtwoorden (alles in md5) en controleer constant op rechten. De plek waar je je wachtwoord invoert of reset is voor mij een routine met een hele hoge muur er om heen.
 
@SmartThinker:
Md5 wordt ook al redelijk onveilig gevonden door velen. Het zou helemaal netjes zijn als je die routine ook nog eens geëncrypt hebt en dus on-the-fly moet decrypten. En dan natuurlijk ook voor debuggers (en andere beveiligingsrisico's) checken voordat je die routine decrypt ;)
Is wel veel werk en waar je het wachtwoord om mee te decrypten dan weer moet laten...

Dit is wel een interessante post over "Anti-reverse engineering": http://www.codeproject.com/Articles/30815/An-Anti-Reverse-Engineering-Guide. Heel interessant, maar je moet er wel de interesse (en het geduld) voor hebben wil je alles kunnen toepassen. Ik heb de link zelf ook nooit helemaal toegepast :rolleyes:

PS: Het geheugen aanpassen is niet reverse engineering, dus dat wordt nog niet eens in de bovenstaande link behandeld...

MartinJM
 
Martin,
Goed leermoment.
Ga mijn best doen ook een vesting ervan te maken.
 
Ik start op met een loginscherm
als het ingevoerde overeenkomt met een beheerder
gaat hij naar het mainform. Ook als een gebruiker
inlogt.

Code:
Public Class Loginscherm
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If TextBox1.Text = "Beheerder" Then
            MainForm.Beheerder = True
            MainForm.ShowDialog()
        ElseIf TextBox1.Text = "Gebruiker" Then
            MainForm.Beheerder = False
            MainForm.ShowDialog()
        End If
    End Sub
End Class

Kom ik in het Mainform en ben beheerder moeten de buttons
Nieuw - Opslaan - Bewerken zichtbaar worden.

Onderstaand declareer ik dus de beheerder.
Code:
Public Class MainForm

    Inherits System.Windows.Forms.Form
    Private Declare Function GetKeyState Lib "user32" (ByVal vKey As Long) As Integer
    [B]Public Beheerder As Boolean = False[/B]
    Dim Conn As New OleDb.OleDbConnection
    Dim ds As New DataSet
    Dim da As OleDb.OleDbDataAdapter
    Dim mySQL As String
    Dim dbProvider As String

Code:
Public Sub New()
        MyBase.New()
        InitializeComponent()
        btnOpslaan.Enabled = False
        LegenSluitenTextboxen("Dichten")
        BoomVullen()
        VullenComboUren()
        TakenVullen()
        VullenSoortwerknemer()
        If Beheerder = True Then    'Beheerder mag alles, dus knoppen zichtbaar
            btnBewerken.Visible = True
            btnOpslaan.Visible = True
            btnNieuw.Visible = True
        End If
    End Sub

In het voorbeeld van MartinJM zit dus een button, als ik daar op klikt werkt
het in zijn voorbeeld. Maar dat heb ik niet, wil alleen buttons zien wanneer
beheerder is ingelogd en andersom dan geen buttons zichtbaar.
Heb van alles geprobeerd, maar loopt steeds vast. Beheerder blijft maar
op False staan.
Heb het bericht van Martin gelezen omtrent de rechten, maar wil dit
eerst onder de knie krijgen.
 
Laatst bewerkt:
Hoi,

Misschien is het mooier om de buttons niet onzichtbaar te maken maar te disablen ("Button.enable = False"). Dan komen er niet van die lege ruimtes op de plekken waar de buttons zaten als er een gebruiker inlogt. Maar dat moet je zelf verder bepalen.

Wat is nu de code voor je login? Want daar zou je de variable Beheerder (in MainForm) op True moeten zetten.

MartinJM

[edit]
Wat volgens mij ook een beetje belangrijk is is welk form als eerste open staat. Probeer eens de lijn "Public Beheerder As Boolean = False" te veranderen in de lijn "Public Beheerder As Boolean". En probeer het dan nog eens. Het zou kunnen dat als je MainForm opent, dat hij dan namelijk automatisch (door "= False") de boolean weer op False zet.

Het zou ook kunnen dat het niet meer werkt (als het InlogForm eerder open staat dan het MainForm) omdat technisch gezien de variable "Beheerder" nog niet bestaat (omdat de hele class nog niet is aangeroepen), maar daarvan ben ik niet zeker. Ik zet dit soort variablen zelf altijd in het InlogForm omdat ik vind dat ze bij het inloggen horen. Dan heb je dit probleem volgens mij ook niet.
[/edit]
 
Laatst bewerkt:
Martin,
Bij het inloggen als de textboxen overeenkomen , gaat hij naar class mainform en dan is hij weer false. Ik jou voorbeeld komt hij weer terug van loginform naar mainform en dan weer loginscherm en dan is hij true. Het is nu laat en overwinningsroes, dus straks loop ik er even door heen en kijk wat er er nu exact gebeurd. Mbt de buttons heb je gelijk, maar dit is ff een probeersel.
Sorry, bij het vernieuwen kwam jouw edit tevoorschijn, was even te snel.
 
Laatst bewerkt:
Eureka, Martin

Ik heb hem werkend.
Public Beheerder as boolean = false gedeclareerd in Loginform.
Bij het debuggen kijken of het een beheerder is daarin.
Dan if beheerder dan Beheerder = true
vervolgens Mainform. show
en dan me.hide = loginscherm weg
Mijn dank is wederom zeer groot.
Kan weer verder.
 
Hoi,

Als je in de settings de "shutdownmode" op "when last form closes" zetten, dan kan je gewoon "Me.Close" gebruiken om het loginform te sluiten. Ik ben er in princiepe een voorstander van om forms te sluiten als je ze niet meer open wil hebben.

Als de vraag zo is opgelost, druk je dan ook op "vraag opgelost", bij je eerste post? Of wil je nu ook nog eerst proberen om het veiliger te maken?

MartinJM
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan