Jump to content
InvisionCommunity.de - Der Deutsche Invision Community Support
Sign in to follow this  
chris5000

[Suche]Attachment Schutz ()

Recommended Posts

index.php?act=Attach&type=post&id=xxx

...lässt jeden Attachments downloaden. Egal ob guest oder nicht, egal ob "Force guests to log in before allowing access to the board?" konfiguriert ist und egal ob in welchem Forum das Attachment gepostet wurde. :(

Weiss jemand von einem Mod, dass vor dem Download überprüft, ob der jeweilige User Zugriff (Permission Mask, "Read") auf das jeweilige Forum hat, in dem das Attachment gepostet wurde?

Oder wenigstens eins, dass die "id" am ende der "act=Attach"-Parameter nicht so leicht erratbar macht, wie es die fortlaufenden Posting-Ids sind?

Gruß,

Chris

Share this post


Link to post

...und falls kein Mod bekannt sein sollte/es keins gibt:

Für jegliche "Was ist skripttechnisch prinzipiell zu tun"-Tips bezüglich einer möglichst gradlinigen Implementierung bin ich ebenfalls dankbar. :D

Gruß,

Chris

Share this post


Link to post

normalerweise haben die attachments eine längere zufalls nummer die ein gast net erraten kann.

ich weiss net was du da genau meinst, aber bei mir können gäste keine downloadlinks sehen.

und von daher wissen sie auch die nummer und den ausführlichen pfad net.

Edited by redcobra

Share this post


Link to post

@redcobra:

Fahr mal mit der Maus über einen Attachment-Link innerhalb eines Posts und schau Dir die Link-URL in der Status-Zeile an.

Die sieht ungefähr so aus:

http://deinedomain/deinpfadzumforum/index.php?act=Attach&type=post&id=id_des_postings

Jetzt Log Dich aus und rufe diese URL auf. Der Download startet :(

Edited by chris5000

Share this post


Link to post

achso das meinst.

ja dann ändere doch ein bissl deine topics.php und post_parser.php ab so dass nur mitlgieder überhaupt den link sehen und gäste erst gar nicth sehen was da für ein attachment dran ist.

Share this post


Link to post

Öffne die lang_topic.php und suche:

?>
Füge darunter dann ein (oder dein eigener Wunschtext):
 

$lang['hidden_attach_file'] = "<b>Dieser Anhang ist für Gäste nicht zugänglich. Bitte logge Dich ein.</b>";
Speichern und Upload ---------------------------------- Öffne die skin_topic.php und suche:
 

class skin_topic {
Füge darunter ein:
function Hidden_attachments($data) {

global $ibforums;

return <<<EOF

<br />

<br />

<strong><span class='edit'>{$ibforums->lang['attached_file']} ( {$ibforums->lang['attach_hits']}: {$data['hits']} )</span></strong>

<br />

<font color='red'>{$ibforums->lang['hidden_attach_file']}</font><br>

EOF;

}
Speichern und Upload --------------------------- Öffne die Topic.php und suche:
   	 //----------------------------------------------------

   	 // Full attachment thingy

   	 //----------------------------------------------------

   	 

   	 $row['attachment'] = $this->html->Show_attachments( array (

                    'hits'  => $row['attach_hits'],

                    'image' => $this->mimetypes[ $row['attach_type'] ][1],

                    'name'  => $row['attach_file'],

                    'pid'   => $row['pid'],

                   )     );

    }

 	 }
Ersetze dies mit dem hier:
 



if (empty($ibforums->member['id'])) {

   	 $row['attachment'] = $this->html->Hidden_attachments( array (

                    'hits'  => $row['attach_hits'],

                    'image' => $this->mimetypes[ $row['attach_type'] ][1],

                    'name'  => $row['attach_file'],

                    'pid'   => $row['pid'],

                   )     );


 	 } else {

   	 

   	 $row['attachment'] = $this->html->Show_attachments( array (

                    'hits'  => $row['attach_hits'],

                    'image' => $this->mimetypes[ $row['attach_type'] ][1],

                    'name'  => $row['attach_file'],

                    'pid'   => $row['pid'],

                   )     );

   	 }

    }

 	 }

Speichern und Upload

---------------------------

Das wars. Probier mal ob dies bei dir klappt.

Share this post


Link to post

dass nur mitlgieder überhaupt den link sehen

Nutzt gegen Ausprobieren nichts.

woher sollen die anderen denn deine links oder deinen aufbau kennen?

Share this post


Link to post

ansonsten ändere in der index.php doch einfach deine act=attach in irgendwas anderes ab.

musst dann nur in den anderen source datein auch abändern.

nur ich denke dass ist überflüssig.

denn kein normaler user kennt deine boardstruktur.

Share this post


Link to post

Naja, ich würde das nicht als Schutz bezeichen, wenn man hofft, das der User so unbedarft ist und nicht weiß, wie man an die angehängte Datei kommt.

Ich würde jedoch mindestens den Hinweis auf ein Attachment entfernen, so das die Leute gar nicht afu dumme Gedanken kommen. Gerade wenn da steht, das es eine angehängte Datei gibt, die man nicht sehen darf, beflügelt den ein oder anderen zu irgendwelchen Taten. ;)

Nebenbei, ich würde einfach in der Attach.php abfragen, ob es sich um ein Mitglied handelt oder nicht. Klappt bei meinem Mod perfekt. :P

Share this post


Link to post

Yep. Hatte gestern keine Zeit mehr, mir den von redcobra vorgeschlagenen Code genauer anzuschauen: Leider ist's nicht was ich brauche. Auch nicht die Änderung von "act=attach" in "act=sonstwas" und - oje - auch eine Abfrage ob Member oder nicht reicht nicht aus. Denn:

Ich habe mehrere Benutzergruppen, die jeweils nur Leseberechtigung für ein einziges Forum haben, in dem auschliesslich für sie bestimmte Downloads (Attachments) vorzufinden sind. Was also benötigt wird, ist eine Überprüfung:

"Hat der via "act=Attach" auf ein Attachment Zugreifende Leseberechtigung für das Forum, in dem das Attachment gepostet wurde oder nicht"

Aber Danke für sämtliche Anregungen: Jetzt ist mein Gehirn immerhin schonmal angesprungen ;)

Gruß,

Chris

Share this post


Link to post

@ stefan

ist denn dein mod schon released?

soweit ich weiss noch nicht oder?

Nein, er ist nicht veröffentlicht worden und ich werde ihn auch weiterentwickeln, damit man auf Basis der Gruppen für jedes Attachment eine Berechtigung festlegen kann.

Ob ich den Mod veröffentlichen werde, steht, wie bei den anderen Mods auch, noch in den Sternen.

Share this post


Link to post
Guest Toey

...und bis dahin erlaube ich mir mal auszuhelfen. ;)

In /sources/misc/attach.php

       	 $DB->query("SELECT pid, attach_id, attach_type, attach_file FROM ibf_posts WHERE pid='".$ibforums->input['id']."'");

       	 

       	 if ( !$DB->get_num_rows() )

       	 {

          $std->Error( array( 'LEVEL' => 1, 'MSG' => 'missing_files' ) );

       	 }

       	 

       	 $post = $DB->fetch_row()
ersetzen durch:
       	 $DB->query("SELECT DISTINCT p.pid, p.attach_id, p.attach_type, p.attach_file, f.read_perms FROM ibf_posts AS p

                            LEFT JOIN ibf_forums AS f ON (f.id=p.forum_id)

                            WHERE p.pid='".$ibforums->input['id']."' LIMIT 1");

       	 

       	 if ( !$DB->get_num_rows() )

       	 {

          $std->Error( array( 'LEVEL' => 1, 'MSG' => 'missing_files' ) );

       	 }

       	 

       	 $post = $DB->fetch_row();


            if (!in_array($ibforums->member['mgroup'],explode(",",$post['read_perms'])))

            {

                $std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_view_topic') );

            }
Dann noch in der /sources/functions.php
        //--------------------------------------------

        // no new headers if we're simply viewing an attachment..

        //--------------------------------------------


        if ( $ibforums->input['act'] == 'Attach' )

        {

            //return $this->member;  // <-- diese Zeile auskommentieren.

        }

Ergebnis: Wer keine Lese-Berechtigung für dieses Forum hat, kann auch das Attachment nicht sehen. Als Fehlermeldung kommt dann zwar, dass man den Beitrag nicht lesen darf aber wer will, kann ja eine neue erstellen.

Share this post


Link to post

Anstatt

        //--------------------------------------------
      // no new headers if we're simply viewing an attachment..
      //--------------------------------------------

      if ( $ibforums->input['act'] == 'Attach' )
      {
          //return $this->member;  // <-- diese Zeile auskommentieren.
      }
sollte man logischerweise folgendes machen
        //--------------------------------------------
      // no new headers if we're simply viewing an attachment..
      //--------------------------------------------
/*
      if ( $ibforums->input['act'] == 'Attach' )
      {
          return $this->member;   <-- diese Zeile auskommentieren.
      }
*/
denn die IF-Abfrage ist dann wohl hinfällig. ;) Dann würde ich bei
            if (!in_array($ibforums->member['mgroup'],explode(",",$post['read_perms'])))
          {
              $std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_view_topic') );
          }
den Bereich
'MSG' => 'no_view_topic'
durch
'MSG' => 'no_permission'

austauschen, damit man auch die richtige Fehlermeldung bekommt. ;)

Desweiteren kann man sich LIMIT 1 sparen, da sowieso maximal eine Ergebniszeile zurück gegeben wird.

Share this post


Link to post
Guest Toey

Zu der Fehlermeldung sagte ich ja bereits was, mit der If-Abfrage hast Recht, aber:

How MySQL Optimises LIMIT

In some cases MySQL will handle the query differently when you are using LIMIT # and not using HAVING:

· If you are selecting only a few rows with LIMIT, MySQL will use indexes in some cases when it normally would prefer to do a full table scan.

· If you use LIMIT # with ORDER BY, MySQL will end the sorting as soon as it has found the first # lines instead of sorting the whole table.

· When combining LIMIT # with DISTINCT, MySQL will stop as soon as it finds # unique rows.

Quelle: MySQL Reference Manual.

...das hat schon seinen Sinn.

Share this post


Link to post

Ja, das hab ich vergessen zu erwähnen, das DISTINCT kannst du dir auch sparen.

Die Spalte pid in der Tabelle ibf_posts ist ein primärer Schlüssel und somit kommen keine Duplikate vor. ;)

Soviel dazu. :lol:

Share this post


Link to post

:w00t: Das sieht seeeehr gut aus :D

Danke Toey! Ich werd's heute noch ausprobieren und berichten.

Nur eine Frage noch vorab: Berücksichtigt der Code auch, wenn für einen User ein Overide in Bezug auf Permission Masks konfiguriert wurde?

(Mir ist nämlich noch eingefallen :blush: , dass ich nicht nur - wie oben beschrieben - verschiedene Benutzergruppen mit verschiedenen Leserechten in Bezug auf Foren habe, sondern vor allem auch viele einzelne User, die zwar zur gleichen Gruppe gehören (eine mit null Leseberechtigung), die aber über eine jeweils extra angelegte Permission Mask und einen Permission Mask Override erst Leseberechtigung für bestimmte Foren bekommen)

Gruß :) ,

Chris

Share this post


Link to post
Guest Toey

:rolleyes: Stefan, glaub was du willst. Ich vertrau dem Handbuch. Und auslachen kannst wen anders!

chris5000, so komplizierte Berechtigungen hab ich bei mir nicht und kann dazu leider niggs sagen. Probiers am Besten einfach mal. Ändere aber trotzdem noch die Zeile hier:

if (!in_array($ibforums->member['mgroup'],explode(",",$post['read_perms'])))
in
if (!in_array($ibforums->member['mgroup'],explode(",",$post['read_perms'])) && $post['read_perms'] != "*")

...gibt ja auch noch Foren wo jeder lesen darf.

Share this post


Link to post

Stefan, glaub was du willst. Ich vertrau dem Handbuch. Und auslachen kannst wen anders!

Vertrau du dem Handbuch, ich dem was ich gelernt habe und was mir die Erfahrung gezeigt hat. Wahrscheinlich stand auch in irgendeinem Handbuch, das man nur die gesamten Befehle innerhalb einer Abfrage auskommentiert, anstatt den gesamten Block. :lol:

Wenn du nicht damit klar kommst, wenn man ein paar Verbesserungen anbringt, dann tut es mir leid.

Thema für mich erledigt.

Share this post


Link to post

Uiuiui: giveup.gif. Woher diese Neigung zu dieser Gereiztheit, wenn's doch eigentlich was zu feiern gibt? Nämlich die nahende Lösung meines Problems dank aller am Thread Beteiligten. Insbesondere natürlich Toey, aber auch Stefan, der meinem armen IPB einen if-check erspart ;) und Redcobra, der mich zum Nachdenken über verschiedene Möglichkeiten angeregt hat, auch wenn nicht das passende dabei war :party:

Ich probier den Code jetzt mal aus :teehee:

Edited by chris5000

Share this post


Link to post

Ändere aber trotzdem noch die Zeile hier:

if (!in_array($ibforums->member['mgroup'],explode(",",$post['read_perms'])))
in
if (!in_array($ibforums->member['mgroup'],explode(",",$post['read_perms'])) && $post['read_perms'] != "*")

...gibt ja auch noch Foren wo jeder lesen darf.

Anstatt diese komplizierte und unnötige Abfrage zu benutzen, könnte man ja auch die Methode check_perms($forum_perm="") aus der Klasse FUNC (Instanz ist $std) nehmen.

Nur als kleiner Hinweis, weil es doch in keinem Handbuch steht. :lol::lol::P

Nebenbei, ich bin nicht gereizt, nur überarbeitet. :lol: :P

Share this post


Link to post
Guest Toey

Junge, du gehst mir allmählich auf den Piss!

Wenn du alles besser weisst, dann machs auch einfach besser und kündige nicht so göttlich irgendwelche Sachen an, deren Veröffentlichung "noch in den Sternen steht".

Ob ich den Mod veröffentlichen werde, steht, wie bei den anderen Mods auch, noch in den Sternen.

Ohhh, bitte, bitte, du Held....zeigs uns armen Würstchen, wie toll du bist und dass du über MySQL sogar mehr weisst, als die Programmierer selber.

Sowas Grosskotziges ist mir ja selten untergekommen.

Lösche diesen Account! Bei manchen Boards reicht ein Tag zum Abstempeln...

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×