| 

.NET C# Java Javascript Exception

3
Hallo,

welche Art der Datenrückgewinnung ist sicherer, wenn Security an oberster Stelle steht?

private void foo(ref byte[] x)
{ ... }


Oder...:

private byte[] foo(byte[] x)
{
...
return x;
}


Der Aufruf:
foo(ref x);

Oder...:

byte[] x = foo(x);



Als C#-Anfänger steht man oft vor der Reichhaltigkeit einer Sprache, die aber doch letztlich die Entscheidung des jeweiligen Entwicklers fordert...

boga
11.09.2013
boga 71 5
2 Antworten
3
Als private deklarierte Methoden sind auch nur innerhalb der Klasse, in welcher sie definiert wurden, bekannt. Somit besteht keine Möglichkeit diese von Außen zu manipulieren (außer vielleicht per Reflection oder wenn der Parameter über eine öffentliche Methode von außen injiziert wurde). Letztendlich muss man die Parameter immer auf gültige Wertebereiche prüfen, wenn man sicher sein will, dass kein Murks übergeben wird.

Daneben sind die Funktionsaufrufe

function byte[] Foo(byte[] param)
void Foo(ref byte[] param)
void Foo(byte[] param)

dahingehend identisch, dass wenn der Inhalt von param innerhalb der Funktion geändert wird, diese Änderungen auch beim Aufrufer sichtbar sind. Grund hierfür ist, dass bei einem Array nur eine Referenz auf das Array und keine Kopie übergeben wird. Wenn ref benutzt wird, wird zwar eine Kopie der Referenz übergeben. Diese zeigt aber letztendlich auf die selben Daten wie das Original. Das ref Keyword macht nur bei Value Types Sinn (also int, double, string etc.) da hier wirklich eine Kopie des Wertes übergeben wird.

Grundsätzlich würde ich die Variante

function byte[] Foo(byte[] param)

bevorzugen. Der Grund ist, dass bereits beim Lesen des Codes klar wird, dass das Array in der Funktion verändert wird.

Gruß
Klaus
11.09.2013
luedi 2,2k 1 9
luedi 2,2k 1 9
Vielen Dank für die Ausführlichkeit. Dann scheint der wesentliche Vorteil von "ref" wohl nur darin zu bestehen, dass man eine zus. Rückgabemöglichkeit hat:

private bool foo(ref...)
...

Und in der Geschwindigkeit werden wohl beide Vers. auch nicht wirklich unterschiedliches Verhalten zeigen.
boga 11.09.2013
0
Wie definierst Du in dem Zusammenhang Sicherheit?
Bei der ref-Übergabe nimmst Du dem Aufrufer die Möglichkeit, seinen Originalwert zu behalten, zumindest auf einfache Art und Weise.
Das wäre ein "Problem" welches mit einer Funktion gar nicht erst auftritt, da ich immer noch mein Original-Array habe und zusätzlich ein von foo gefülltes erhalte.

Ob das jetzt als Sicherheitsaspekt anzusehen ist, musst Du entscheiden :)
11.09.2013
Jens Duczmal 2,6k 1 3 9
"Sicherheit" wird hier def.: Angreifbarkeit von aussen. Was ist, od. ist davon überhaupt was, so betrachtet sicherer?
boga 11.09.2013
Hinweisen möchte ich auch noch darauf, dass in der oben genannten "Oder-Lösung" dem sog, Aufrufer auch kein Original erhalten bleibt.
boga 11.09.2013

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH