Arrays miteinander vergleichen und "unterschied" ausgeben

  • VB.NET

Es gibt 59 Antworten in diesem Thema. Der letzte Beitrag () ist von ThePlexian.

    1. Das kann so nicht funktionieren, Du müsstest erstmal alle Daten herunterladen und in Dateien schreiben oder zumindest ganz laden und dann irgendwie vergleichen, aber nicht jede Zeile in eine ListBox hinzufügen(?)
    2. Ist FTP sauunsicher.
    3. Sicherheit: Gefahrenquelle Quellcode - Du gibst mir mit der Routine in Deinem Code nämlich Zugriff auf Deinen Server -> Kann jeden Scheiß damit anstellen. Sehr schlechte Idee, dafür gibt es HTTP(S) und Webspaces. FTP ist dafür gar nicht geeignet.
    4. Wenn das ein Updater wird, ist die Herangehensweise schon falsch, da dieser Weg richtig Overhead erzeugt und nicht grade performant ist. Stattdessen müsste man entweder ganze Pakete nutzen oder mit Hashdaten arbeiten. Wird das einer? Dann sollte man das nämlich anders angehen. Zusätzlich Aspekt Nr. 3.
    Also macht wenig Sinn das zu extenden und das Beispiel irgendwie zum Laufen zu bringen, da schon die Herangehensweise falsch ist und dringend geändert werden muss. Was genau hast Du also vor?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Also der Code funktioniert bei mir prächtig, und er tut auch das was er soll :)

    Zu 2. Ich weiß dass FTP unsicher ist, aber ich habe keine andere Lösung gefunden. Zudem ist für dieses Programm ein extra Benutzer im FTP Server eingetragen, sodass eigentlich nur die Programmdateien gelöscht werden können, mehr nicht

    Zu 3. Der Rest im Programm läuft komplett über HTTP

    Zu 4. Das wird ein Updater für viele Dateien. Für andere Ansatzweisen dass ganze umzusetzen bin ich gerne offen :)
    Es muss alles über HTTP(S) laufen. In Deinem Code hast Du schon mindestens zwei Sicherheitslücken, offen liegende Credentials, RCE und FTP kann man ja auch noch als eine sehen.

    Mein Tipp: Plage Dich nicht länger herum und nimm eine Fertiglösung, die das Ganze sicher und performant implementiert.
    Updater - Warum sollte man eigene Updater vermeiden?

    Es bringt Dir nichts einen Code zu schreiben, der viele Security Leaks aufweist und wahnsinnig unperformant ist und im Ansatz anders sein müsste.
    Und Faustregel: Auf Deinem Server hat niemand etwas zu suchen, nie und nimmer, selbst mit extra Benutzer o. ä., denn für alle Inhalte haftest Du und eine Fehlkonfiguration beschert dir Probleme.

    ​...nur Programmdateien gelöscht werden können

    Und was ist, wenn diese mit Malware ausgetauscht werden? Tjoa, so einfach ist es dann nicht und wenn ich Dir in den Daten, die Dein Programm betreffen, rumfummeln kann, ist was falsch. Das aktuell da ist eine perfekte Vorlage für eine RCE, man braucht fast gar nichts zu machen, also bitte, ändere das!

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Lade mit einem PHP Script den Inhalt des Online Verzeichniss aus und Übergebe das an dein Programm. Ich habe das gelöst das mein Script den Dateinamen und einen md5 Hash ausgibt. Denn den Hash zu vergleichen ist etwas schneller.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Sicherheit darf nie vernachlässigt werden. Wenn das Teil aus irgendeinem Grund doch mal in falsche Hände gerät, dann war's das.
    Und wie gesagt, habe schon alles geschrieben, wie man sowas ansetzen kann (Pakete oder mit Hashprüfungen) und trotzdem würde ich was fertiges nutzen, wie gesagt, mit dem Teil haste eine perfekte Vorlage für einen gekaperten Webserver.

    Mir ist durchaus bewusst, dass die Bekannten vielleicht nichts böses machen, nur, wie gesagt, wenn das Teil jemand anders ungewollt mal in die Finger bekommt ... wäre mir zu riskant. Zudem ist ein MITM-Angriff darüber immer noch möglich. Nicht nur das, bei FTP kann ich Dir sogar die Credentials abgreifen und fertig.

    @Andy Zumindest kein FTP, RCE nach einem MITM-Angriff wäre jedoch nicht ausgeschlossen. Zudem müsste man da btw Verzeichnisstrukturen beachten und das Ganze rekursiv lösen. ;)
    Aber am Besten sind immer noch ganze Pakete, auch für Validierungen etc. ist bei denen der Aufwand sehr gering.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hier ist mein Code, aber wenn du php nicht kannst, ist es nicht sinvoll Copy und Paste zu nutzen. Code Lizenz CC- BY

    PHP-Quellcode

    1. <?php
    2. class UpdateInfo
    3. {
    4. public function getUpdateFiles($dir)
    5. {
    6. $handle = opendir($dir);
    7. while($file = readdir($handle))
    8. {
    9. if($file != "." && $file != ".." && $file != "UpdateInfo.php")
    10. {
    11. if(is_file("$dir/$file"))
    12. {
    13. echo str_replace($_SERVER["DOCUMENT_ROOT"]."/Start_Dir", "", $dir)."/".$file.";".md5_file($dir."/".$file)."</br>";
    14. }
    15. else if(is_dir("$dir/$file"))
    16. {
    17. $this->getUpdateFiles($dir."/".$file);
    18. }
    19. }
    20. }
    21. closedir($handle);
    22. }
    23. }
    24. $update = new UpdateInfo();
    25. $update->getUpdateFiles($_SERVER["DOCUMENT_ROOT"]."/Start_Dir");
    26. ?>
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    ​Zudem ist ein MITM-Angriff darüber immer noch möglich. Nicht nur das, bei FTP kann ich Dir sogar die Credentials abgreifen und fertig.

    Und wenn ich auf dem Server selbst nur Leserechte habe, riskant ist es trotzdem, ein Fehlkonfiguration und das war's. Auf den eigenen FTP sollte nie jemand drauf, außer Du! Dafür gibt es HTTP(S)!

    Lies Dir den verlinkten Thread nochmal durch, man sieht, dass Du ihn noch nicht verstanden hast.
    Ich meine das alles nicht böse, im Gegenteil, mir liegt das nur am Herzen Dich zu warnen. Es liegt bei Dir, aber wenn Du vernünftig bist, dann höre darauf, ich sage das nicht zum Spaß.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Trade der Code leist Rekursiv aus. Das die Dateien noch Signiert werden müssen stimmt. Kannst du mit php.net/manual/de/function.openssl-sign.php machen.

    Eine Fertige Lösung wäre da am angenehmsten, wie Trades updater ;)
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    ich mache hier was sehr einfaches, nämlich mich schlicht an der Verfahrensfrage, die der TE ursprünglich mal hatte, versuchen. Ich frage also insbesondere nicht danach, mit was für konkreten Gegenständen es im Fall dieses Problems zu tun ist (das ist unnötig), ich beschäftige auch nicht mit Implementierungsfragen bzgl. des angebotenen Lösungsversuchs (danach hat der TE nicht gefragt) und ich missioniere den TE auch nicht mit meinen persönlichen Sicherheitsmanien (das hat sich der TE auch nicht erbeten).

    zunächst etwas zum aufwärmen:
    zwei Arrays, die verschmolzen werden unter Eliminierung von Mehrfachvorkommnissen, (1, 1) wird also zu (1)

    Brainfuck-Quellcode

    1. Public Sub mtawd()
    2. 'merge two arrays without doubles
    3. '
    4. 'arrays ar1 und ar2 zusammenlegen in ar3
    5. '---------------------------------------
    6. Dim ar1() As Variant
    7. ar1 = Array(1, 2, 3) '2
    8. Dim ar2() As Variant
    9. ar2 = Array(1, 9, 3, 4, 5)
    10. Dim ar3() As Variant
    11. ReDim ar3(UBound(ar1) + UBound(ar2) + 1)
    12. Dim e0 As Integer
    13. For e0 = 0 To UBound(ar1)
    14. ar3(e0) = ar1(e0)
    15. Next e0
    16. For e0 = UBound(ar1) + 1 To UBound(ar3)
    17. ar3(e0) = ar2(e0 - UBound(ar1) - 1)
    18. Next e0
    19. '
    20. 'mehrfachvorkommnisse von elementen in ar3 entfernen während das ergebnis dieses vorgangs sukzessive in ein neuen array newar() geschrieben wird
    21. '-----------------------------------------------------------------------------------------------------------------------------------------------
    22. Dim newar() As Variant
    23. Dim e1 As Integer
    24. Dim e2 As Integer
    25. Dim e3 As Integer
    26. Dim e4 As Integer
    27. Dim z1 As Integer
    28. '(z2 = 0) = es wurde innerhalb e2 keine nicht-identität ar3-newar festgestellt und daher nichts neues aus ar3 in newar gespeichert
    29. '(z2 = 1) = es wurde innerhalb e2 eine nicht-identität festgestellt und daher speicherung des ar3-elements in newar
    30. Dim z2 As Integer
    31. Dim z3 As Integer
    32. Dim l1 As String
    33. '
    34. For e1 = 0 To UBound(ar3)
    35. z2 = 0
    36. If (Not newar) = -1 Then
    37. z1 = 0
    38. ReDim newar(0)
    39. newar(z1) = ar3(e1)
    40. '
    41. ElseIf Not (Not newar) Then
    42. For e2 = 0 To UBound(newar)
    43. z3 = 0
    44. If ar3(e1) = newar(e2) Then
    45. 'If z2 <> 0 Then
    46. ' continue e2
    47. 'Else
    48. Exit For
    49. 'End If
    50. ElseIf ar3(e1) <> newar(e2) Then
    51. For e3 = 1 To UBound(newar)
    52. If ar3(e1) = newar(e3) Then
    53. z3 = z3 + 1
    54. End If
    55. Next e3
    56. If z3 = 0 Then
    57. If z2 = 0 Then
    58. z1 = z1 + 1
    59. ReDim Preserve newar(z1)
    60. newar(z1) = ar3(e1)
    61. z2 = z2 + 1
    62. Exit For
    63. End If
    64. Else
    65. Exit For
    66. End If
    67. End If
    68. Next e2
    69. End If
    70. Next e1
    71. '
    72. For e4 = 0 To UBound(newar)
    73. l1 = l1 & newar(e4) & Chr(13)
    74. Next e4
    75. MsgBox (l1)
    76. '
    77. End Sub


    Man kann jetzt noch eine Eingabebox (am besten gleich für das zusammengelegte Array) basteln, um den code wahllos zu testen, oder man arbeitet zwecks Test mit relevanten Modell-Fällen, bastelt also ein Test-Modell, je stärker das Modell, desto allgemeingültiger der vorgestellte code.
    Aufpassen muss man mit der phrase (not >arrayname<) bzw (not (not >arrayname<)), es kann sein, dass diese phrase nicht in jeder vb-version funktioniert, ich habe hier excel 2007 benutzt, ansonsten muss man eben zusehen, wie man anders die Initialisierung eines array feststellt

    jetzt zum erfragten differenz-Array:

    Quellcode

    1. Public Sub edar()
    2. 'extract difference-array
    3. '
    4. Dim ar1() As Variant
    5. ar1 = Array(1, 2, 6)
    6. Dim ar2() As Variant
    7. ar2 = Array(1, 2, 3, 4, 5)
    8. 'ar1 und ar2 in ar3 vereinigen
    9. Dim ar3() As Variant
    10. ReDim ar3(UBound(ar1) + UBound(ar2) + 1)
    11. Dim e0 As Integer
    12. For e0 = 0 To UBound(ar1)
    13. ar3(e0) = ar1(e0)
    14. Next e0
    15. For e0 = UBound(ar1) + 1 To UBound(ar3)
    16. ar3(e0) = ar2(e0 - UBound(ar1) - 1)
    17. Next e0
    18. Erase ar1
    19. Erase ar2
    20. '
    21. 'difference array, control array, laufvariablen, zähler, schalter
    22. Dim dar() As Variant
    23. Dim car() As Variant
    24. Dim e1 As Integer
    25. Dim e2 As Integer
    26. Dim e3 As Integer
    27. 'z1 längenmass car, wird hochgezählt
    28. Dim z1 As Integer
    29. 'z2 übereinstimmung gefunden in einem e2-lauf, wird zurückgesetzt
    30. Dim z2 As Integer
    31. 'z3 längenmass dar, wird hochgezählt
    32. Dim z3 As Integer
    33. 'Treffer in car, wenn Treffer 1 setzen, bleibt sonst 0, muss zurückgesetzt werden
    34. Dim s1 As Integer
    35. 'initialisierungsaktion car wird deklariert (wird gerade initialisiert = 1 setzen, 0 = nicht initialisiert ist ausgangszustand), wird nie auf 0 zurückgesetzt
    36. Dim s2 As Integer
    37. '
    38. Dim l1 As String
    39. Dim e4 As Integer
    40. '
    41. s2 = 0
    42. s1 = 0
    43. z3 = 0
    44. '
    45. For e1 = 0 To (UBound(ar3) - 1)
    46. z2 = 0
    47. s1 = 0
    48. For e2 = (e1 + 1) To UBound(ar3)
    49. 'wenn Übereinstimmung gefunden wurde, in car speichern
    50. If ar3(e1) = ar3(e2) Then
    51. z2 = z2 + 1
    52. 'car noch nicht initialisiert
    53. If (Not car) = -1 Then
    54. z1 = z1 + 1
    55. ReDim car(z1 - 1)
    56. car(z1 - 1) = ar3(e1)
    57. s2 = s2 + 1
    58. 'car bereits initialisiert
    59. ElseIf Not (Not car) Then
    60. z1 = z1 + 1
    61. ReDim Preserve car(z1 - 1)
    62. car(z1 - 1) = ar3(e1)
    63. End If
    64. End If
    65. Next e2
    66. 'wenn für e1 keine weiteren instanzen im e2-lauf gefunden wurden
    67. If z2 = 0 Then
    68. 'wenn car initialisiert ist
    69. If s2 = 1 Then
    70. For e3 = 0 To UBound(car)
    71. If ar3(e1) = car(e3) Then
    72. s1 = s1 + 1
    73. End If
    74. Next e3
    75. End If
    76. If (s2 = 0) Or ((s2 = 1) And (s1 = 0)) ThenIf z3 = 0 Then
    77. If e1 < (UBound(ar3) - 1) Then
    78. ReDim dar(z3)
    79. dar(z3) = ar3(e1)
    80. z3 = z3 + 1
    81. ElseIf e1 = (UBound(ar3) - 1) Then
    82. 'beides speichern
    83. z3 = z3 + 2
    84. ReDim dar(z3 - 1)
    85. dar(z3 - 2) = ar3(e1)
    86. dar(z3 - 1) = ar3(UBound(ar3))
    87. End If
    88. Else
    89. If e1 < (UBound(ar3) - 1) Then
    90. z3 = z3 + 1
    91. ReDim Preserve dar(z3 - 1)
    92. dar(z3 - 1) = ar3(e1)
    93. ElseIf e1 = (UBound(ar3) - 1) Then
    94. z3 = z3 + 2
    95. ReDim Preserve dar(z3 - 1)
    96. dar(z3 - 2) = ar3(e1)
    97. dar(z3 - 1) = ar3(UBound(ar3))
    98. End If
    99. End If
    100. End If
    101. End If
    102. Next e1
    103. '
    104. For e4 = 0 To UBound(dar)
    105. l1 = l1 & dar(e4) & Chr(13)
    106. Next e4
    107. MsgBox (l1)
    108. '
    109. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „rx13“ ()

    aber du programmierst vb6, obwohl der TE seinen Thread als vb.net gelabelt hat 8|

    Ein anderes Problem wird sein, dass vermutlich verschiedenerlei Arten von Arrays verglichen werden müssen:
    Nämlich die Ausgabe eines FTP-File-Listings besteht aus Strings, aber das lokale Dateisystem hält man besser in einem Array von FileInfos.
    @ErfinderDesRades Jou

    rx13 schrieb:

    Brainfuck-Quellcode

    rx13 schrieb:

    Visual Basic-Quellcode

    1. Dim dar() As Variant
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    aber du programmierst vb6, obwohl der TE seinen Thread als vb.net gelabelt hat 8|

    Ein anderes Problem wird sein, dass vermutlich verschiedenerlei Arten von Arrays verglichen werden müssen:
    Nämlich die Ausgabe eines FTP-File-Listings besteht aus Strings, aber das lokale Dateisystem hält man besser in einem Array von FileInfos.


    das sind ja wohl alles keine unüberwindlichen Hürden, er sollte die Struktur einer Lösung auf die von ihm verwendeten Mittel übertragen können, das ist eine ziemlich schlichte Aufgabe
    und verschiedene Arten von Arrays vergleichen, ist das jetzt ein Einwand?

    rx13 schrieb:

    das ist eine ziemlich schlichte Aufgabe
    ja, zB Doubletten aus einem Array auszufiltern erledigt man in .Net mit einer einzigen Zeile.
    Zumindest diesen Teil deines Codes auf .Net zu übertragen würde ich von abraten.

    ja, das mit den verschiedenen Array-Element-Datentypen ist ein Einwand. Aber nur ganz allgemein, weil im Einzelnen verstehe ich deinen Code nicht, und ist mir auch zu aufwändig, mich da nun einzuarbeiten, v.a., wo der Thread schon fast 3 Wochen alt ist - ich nehme an, der TE hat längst seine eigene Lösung, oder ist vlt. auch ganz davon abgekommen.
    Steht hier bestimmt schon, aber nochmal für @rx13 :

    VB.NET-Quellcode

    1. ​Dim ints1 As Integer() = {5, 3, 9, 7, 5, 9, 3, 7}
    2. Dim ints2 As Integer() = {8, 3, 6, 4, 4, 9, 1, 0}
    3. Dim union As IEnumerable(Of Integer) = ints1.Union(ints2)
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais