Schrift
[thread]11921[/thread]

Zugriff auf Routinen verhindern?

Leser: 1


<< >> 10 Einträge, 1 Seite
Gast Gast
 2008-05-27 14:39
#110357 #110357
Hallo!
Hab mal folgende Frage/ folgendes Problem:
Ich habe eine database.cgi welche - wer hätte das gedacht - für eine eigene Datenbank zuständig ist.
In dieser Datei habe ich mehrere Subroutinen, welche für verschiedene Teilaufgaben zuständig sind. Die Datei selbst ist ein Teil eines Hauptprogrammes, welches mit require/use geladen wird.
Nun möchte ich aber, das von aussen her natürlich nur auf EINE bestimmte Subroutine zugegriffen werden kann, damit man nicht z.B. die Rechtevergaben überspringen/ abfangen kann.
Wie ist sowas möglich, ohne aus allen Subroutinen eine einzige zu machen?
pq
 2008-05-27 15:19
#110360 #110360
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
also perl-code den aufruf von subroutinen zu verbieten, ist eigentlich nicht besonders sinnvoll,
denn wenn ich perl-code schreiben darf, der auf ein modul zugreift (und database.cgi ist
augenscheinlch ein modul, also solltest du es besser auch so nennen), dann kann ich
den code, auf den ich nicht zugreifen können soll, auch selbst schreiben.

in manchen objektorientierten sprachen hat man das konzept von privaten methoden, in
perl ist das einfach nur ein standard, der umgangen werden kann - man benennt solche
methoden mit einem führenden unterstrich.

also erklär mal bitte genauer, was du da machen willst.
wirklich verbieten kann man subroutinenaufruf von aussen nur, wenn es anonyme, lexikalische
subroutinen sind, aber vermutlich brauchst du das gar nicht.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2008-05-27 15:45
#110361 #110361
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Soll nur aus dem Package heraus die Subroutinen zugegriffen werden?

Zur Not kann man es so machen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/perl

use strict;
use warnings;

{
  package MyTest;

  sub new {

    print "(new) erlaubt\n";
    print "rufe test() auf\n";
    test();
    print "test() wurde aufgerufen\n";
  }

  sub test {
    my @info = caller(0);

    if( $info[0] ne __PACKAGE__ ) {
      print "(test) nicht erlaubt: Aufruf aus Package $info[0]\n";
    }
    else{
      print "(test) erlaubt\n";
    }
  }
}

package main;

print "rufe new() aus main auf\n";
MyTest->new;
print "rufe test() aus main auf\n";
MyTest->test;


Edit: Oder wie pq es gesagt hat:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl

use strict;
use warnings;

{
  package MyTest;

  my $test;

  sub new {
    $test->();
  }

  $test = sub {
      print "(test) erlaubt\n";
  }
}

package main;

MyTest->new;


Da $test eine lexikalische Variable ist, kann man nicht "von außen" zugreifen.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2008-05-27 16:28
#110363 #110363
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
renee+2008-05-27 13:45:41--
Soll nur aus dem Package heraus die Subroutinen zugegriffen werden?

Zur Not kann man es so machen:
Code (perl): (dl )
1
2
3
    if( $info[0] ne __PACKAGE__ ) {
      print "(test) nicht erlaubt: Aufruf aus Package $info[0]\n";
    }

ja, aber das bringt nix. niemand hält den programmierer davon ab, das richtige
package vor den aufruf zu schreiben, um zu schummeln. darum ging es mir. es ist so nicht möglich.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2008-05-27 16:35
#110364 #110364
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ja, so ganz streng wie in anderen Programmiersprachen geht es nicht. Aber ist auch immer die Frage, wie "paranoid" man dabei ist (und wie "schlau" die anderen Programmierer sind).
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
murphy
 2008-05-27 17:00
#110366 #110366
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
renee+2008-05-27 13:45:41--
[...] Da $test eine lexikalische Variable ist, kann man nicht "von außen" zugreifen.


Wie man's nimmt – mit CPAN:PadWalker kann man schon darauf zugreifen.
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2008-05-28 11:15
#110388 #110388
Naja in der Datenbank gibts halt verschiedene Teilabschnitte wie Berechtigungen, Lesen/ Schreiben, ent/ verschlüsseln,...
Und es sollten halt wirklich alle Funktionen in der richtigen Reihenfolge abgearbeitet werden.
Jemand der sich auskennt, für den ist das sicher kein Thema. Viel mehr ging es darum, das Plugins,... die Datenstrukturen nicht durcheinander bringen.
Die Codebeispiele werd ich mir heute abend mal angucken, vllt lass ich das mit dem abkappseln auch ganzbleiben.
pq
 2008-05-28 12:13
#110392 #110392
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
wie gesagt, benenn die routinen einfach um, mach einen unterstrich vornedran.
damit erklärst du sie als privat. dann kannst du's auch nicht aus versehen verwechseln.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
moritz
 2008-05-28 12:52
#110393 #110393
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
renee+2008-05-27 13:45:41--
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl

use strict;
use warnings;

{
  sub test {
    my @info = caller(0);

    if( $info[0] ne __PACKAGE__ ) {
      print "(test) nicht erlaubt: Aufruf aus Package $info[0]\n";
    }
    else{
      print "(test) erlaubt\n";
    }
  }
}


Das hat auch das kleine Problem, dass man Vererbung verhindert. Das kann gewünscht sein, muss aber nicht.
renee
 2008-05-28 13:07
#110394 #110394
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
moritz+2008-05-28 10:52:29--
Das hat auch das kleine Problem, dass man Vererbung verhindert. Das kann gewünscht sein, muss aber nicht.


Private Elemente werden normalerweise nicht weitervererbt ;-)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 10 Einträge, 1 Seite



View all threads created 2008-05-27 14:39.