Dies ist mit Abstand die schlechteste Funktion, die jemals aus Gründen der Lesbarkeit und Sicherheit implementiert wurde. Grundsätzlich werden alle empfangenen GET-Parameter in Variablen umgewandelt.
Zum Beispiel mit dieser URL: /index.php?value=foobar
Sie können Folgendes tun:
<?php
echo $value; // return foobar
?>
Wenn Sie Code lesen, ist es sehr verwirrend zu wissen, woher die Variable kommt.
Auch wenn die Funktion missbraucht wird, kann dies zu Sicherheitslücken führen. Hier ist ein Codebeispiel von php.net, das zeigt, wie es missbraucht werden kann:
<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
$authorized = true;
}
// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
include "/highly/sensitive/data.php";
}
?>
Das ist schrecklich. Ich verstehe zwar, was ich will, aber standardmäßig
ergab es
14
Es ist zu beachten und hervorzuheben, dass Registerglobale seit PHP 4.2 (im Jahr 2000) nicht mehr standardmäßig aktiviert sind, in PHP 5.3 (2009) veraltet sind und in PHP 6 vollständig entfernt werden, die Benutzer jedoch weiterhin zurückkehren auch nach 10 Jahren noch gut in das "OMG register globals" aufgenommen.
1
Pretty Hopeless PHP
Ming-Tang
@SHiNKiROU Es ist nicht hoffnungslos, wurde diese Funktion veraltet und wird in PHP 6 entfernt werden
HoLyVieR
1
Es ist nicht hoffnungslos, es liegt nur so weit hinter so vielen anderen Sprachen, dass der einzige Grund, warum jemand es verwendet, darin besteht, dass es bis vor kurzem viel einfacher war, billiges Webhosting dafür zu bekommen als andere Sprachen.
Intuited
22
Erlaube standardmäßig Null, den "Billionen" * Dollar Fehler. Entschuldigung Tony Hoare. Fast jede Sprache auf dem Planeten verfügbar.
Dies ist kein Merkmal oder Fehler, sondern ein Mangel an Merkmalen. Nicht-nullbare Referenztypen zu haben, ist nichts, was Sie leicht in eine Sprache fallen lassen können. Es erfordert viel Nachdenken und gutes Design und ist sehr schwer in einer Weise zu tun, die sich nicht wie ein Kampf mit dem Compiler anfühlt. Spec # und Singularity zeigen, wie schwer es ist.
imgx64
@ imgx86, nein, das ist definitiv ein Fehler. Nicht nullfähige Referenztypen sind eine Funktion, die als Reaktion auf den Nullfehler hinzugefügt wurde, um die Kompatibilität mit einem Typsystem zu ermöglichen, das normalerweise Null zulässt.
Matt Olenik
@Kyralessa: Vielleicht möchte er sichergehen, dass HoLyVieR das populistische Abzeichen bekommt? :-) Ich stimme zu, es macht keinen Sinn, deine eigene Antwort so zu akzeptieren.
Macneil,
18
C- und C ++ - MAKROS. Wenn ich jemals einen anderen Compilerfehler sehen muss, weil jemand einen Standardfunktionsnamen für sein Makro gewählt hat, der meinen Code durcheinander bringt, werde ich schreien. Lassen Sie uns die letzte Beleidigung sehen:
Namespacing ist eines der Dinge, die typedefs und Vorlagen sofort benutzerfreundlicher machen.
Shog9
4
Einverstanden, aber nur, weil moderne Sprachen Ersatz für die Funktionalität von Textmakros gefunden haben. Als sie erfunden wurden, waren Makros eine gute Sache, weil die Compilertechnologie so primitiv war.
Dsimcha
Wo haben Sie dieses Makro gefunden?
Rwong
@dsimcha - Ich weiß nichts darüber. Lisp-Makros gibt es schon lange.
Jason Baker
2
@Jason: Ich klopfe nicht an "echte" AST-Makros im Lisp-Stil, die immer noch nützlich und cool sind. Ich hasse nur Makros im C / C ++ - Stil, die rein textuell funktionieren, keine Vorstellung vom Umfang haben, die es ermöglichen, lächerlich undichte Abstraktionen und verschleierten Code zu erstellen, und die durch modernere Funktionen, von denen eine ironischerweise veraltet sein kann ist "echte" Makros.
Dies ist immer eine hilfreiche Funktion in dem gesamten Code, den ich geschrieben habe. Wie ist das ein Fehler?
greyfade
6
@greyfade: Es ist hilfreich, bis Sie die breakAnweisung vergessen oder jemand einen Fall zwischen zwei Fällen hinzufügt (oder sie neu anordnet), ohne zu bemerken, dass ein Durchfall zwischen ihnen aufgetreten ist . Ich sehe keine Möglichkeit, dass ein Fallthrough besser ist als die C # -Methode, bei der entweder eine Pause oder ein Fall erforderlich ist usw.
Tim Goodman
9
Duffs Gerät macht sich über Ihre Straflosigkeit lustig!
Jesse C. Slicer
3
Genau. Standardmäßig ist keine gute Funktion.
11
Liest niemand? Er sagte Fallthrough BY DEFAULT
Matt Olenik
13
Implizite Typkonvertierungen, wenn die Typen, zwischen denen konvertiert wird, keine offensichtliche Beziehung haben. Zum Beispiel das Konvertieren einer zufälligen, nicht numerischen stringin eine int, wie in PHP.
Es sollte beachtet werden, dass diese Art von Dingen kein Problem darstellt, wenn Sie sich erst einmal darum gekümmert haben. Es ist nur dann wirklich ein Problem, wenn Sie in kritischen Bereichen keine Überprüfung auf vom Benutzer eingegebene Werte durchführen. Dies ist jedoch unendlich nützlich, wenn Sie beispielsweise wissen, dass etwas eine Zahl sein wird, aber als Zeichenfolge vorliegt. Beispielsweise wird ein Feld aus einer Datenbank wahrscheinlich als Zeichenfolge zurückgegeben, und Sie möchten sich nicht darum kümmern, es umzusetzen.
Tarka,
2
@ Slokun: Können Sie sich ein besseres Beispiel einfallen lassen? Warum Integralwerte in einer Datenbank mit einem Zeichenfolgentyp speichern?
Steven Evers
@SnOrfus Übergeben einer Nummer in einer URL, Benutzereingaben, Funktionen und anderen Dingen, die nicht statisch typisierten Sprachen gemeinsam sind.
TheLQ
Dies ist auch ein Problem in C, da der Wert einer in Anführungszeichen gesetzten Zeichenfolge ein Zeiger ist, der in eine Ganzzahl konvertiert werden kann. Dadurch können Konstrukte erstellt werden, die so aussehen, als ob sie sinnvoll wären, richtig kompiliert werden, aber Unsinn erzeugen. In C ++ können Sie Konvertierungsfunktionen mit dem Schlüsselwort definieren explicit, wodurch implizite Typkonvertierungen gestoppt werden. Es gibt jedoch weiterhin Probleme.
David Thornley
@TheLQ: Wenn es sich um eine Benutzereingabe handelt, müssen Sie diese validieren, um herauszufinden, ob es sich um eine Zahl handelt. Wie @ Slokun sagte. Wenn Sie Daten aus einer Datei lesen, können Sie damit rechnen, dass numerische Daten dort abgelegt werden, wo sie abgelegt werden sollen. Im Falle einer Festplattenbeschädigung ist es jedoch oft besser, eine Ausnahme auszulösen, als nur einen Zufallswert 0für einen bestimmten Wert zu haben.
Intuited
12
goto : Obwohl es in seltenen Fällen in Ordnung ist, wird es häufiger missbraucht und führt zu schwer lesbaren Programmen.
Ich habe das Gegenteil gesehen, wo das Ermöglichen der vernünftigen Verwendung von goto ein Programm vor 3 Millionen Codezeilen bewahrt hätte.
Dave
2
Ah, Übertreibung ... Eine gültige literarische Technik.
Robert Harvey
11
KEINER
Nur weil eine Funktion häufig missbraucht wird, ist sie nicht schädlich.
IMHO ist das gesamte "als schädlich" die Reductio ad Hitlerum der Programmiersprachendiskussionen.
Die meisten, wenn nicht alle "schädlichen" Merkmale haben oder hatten ursprünglich einen sehr gültigen Anwendungsfall oder sind in erster Linie einfach Bequemlichkeitsmethoden. Es liegt an den Entwicklern, die Vor- und Nachteile und den Code entsprechend zu verstehen.
Wenn Ihre Fragen so aussehen sollten, wie "Welche Sprachmerkmale haben gemeinsame Fallstricke oder unglückliche Nebenwirkungen?", Wäre meine Antwort anders.
[edit] Um es klar zu sagen: Ich meine nicht die fortgesetzte Verwendung veralteter Methoden. Wenn die Entwickler eine Funktion abwerten / entfernen, sollten Sie den Ersatz verwenden. Ich beziehe mich auf das Konzept, dass ein aktueller Teil der Sprache als schädlich eingestuft wird, weil einige nicht mögen, was er fördert, oder den Kompromiss, der damit verbunden ist, dass viele Leute darüber diskutieren.
Ich bin anderer Meinung, ein gutes Gegenbeispiel ist meine Antwort. PHP-Register global war einfach schlecht, egal wie Sie sie verwenden. Aus diesem Grund wird davon abgeraten, niemals ältere PHP-Versionen zu verwenden.
HoLyVieR
5
+1 In falsche Hände geben, jedes Sprachkonstrukt ist schädlich.
Mouviciel
5
Guter Punkt ... auch wenn 95% der GOTOS schlecht sind, lohnt es sich immer noch, das Feature selbst für die anderen 5%
Ausgaben
1
Ich denke, es ist eher so, als würde man den Auswerfersitzknopf neben den Ein- / Ausschalter des Radios stellen. Die Funktion selbst ist möglicherweise nicht schlecht, verhindert jedoch keinen Schaden durch versehentliche Verwendung.
LennyProgrammers
1
Ich denke, dies ist das Programmieräquivalent von "Waffen töten nicht Menschen, Menschen töten".
Orbling
7
Autovivification (oder ein anderes Bind-Variable-On- (Assign | Use) -Feature) ist das Feature, von dem ich festgestellt habe, dass es die meisten Fehler verursacht.
Diese Sprache sollte nicht ernsthaft benutzt werden. Es wurde entwickelt, um eine sehr 'einzigartige' Programmiersprache zu sein, also ist es voll von Dingen (z. B. Comefrom - wie ich finde), die keinen Sinn ergeben.
ShdNx
4
Ich dachte, es wäre offensichtlich, aber ich bin mir bewusst, dass es keine ernsthafte Sprache ist.
Alan Pearce
2
Sorry, einige Leute sind hier zu ernst.
Mark C
1
Habe erst letzte Woche die Sprache auf Wikipedia entdeckt und war begeistert davon, wie beliebt sie war (und ist immer noch O_O).
Oliver Weiler
Es gibt eine Reihe von "Herausforderungs" -Sprachen, die immer sehr beliebt sind, da Programmierer aus Liebe zur Jagd dazu neigen, ihre Arbeit zu erledigen. Sehr beliebt bei Interviewfragen, da sie bewusst stumpf, nachdenklich und hart sind.
Orbling
7
Obwohl einige Leute mit dem Mann oder verschiedenen Dingen, die er sagt, nicht einverstanden sind, bezieht sich eine Menge von Douglas Crockfords JavaScript: The Good Parts im Grunde auf diese Frage bei JS. Zu Crockfords Beschwerden gehören:
Standardmäßig globaler Gültigkeitsbereich für alles (DC zeigt, wie Funktionen / Objekte als Namespaces und Gültigkeitsbereichsbegrenzer verwendet werden, um dies in Konflikt zu bringen.)
Anweisungen wie with, deren Fehlverhalten darin besteht, Dinge im globalen Namespace zu definieren. (Gah! Es ist wie das JS-Motto, wenn Sie scheitern, dann scheitern Sie so schwer wie möglich !)
Unerwartetes Verhalten mit dem ==Operator, sodass Sie den Operator grundsätzlich immer verwenden müssen ===.
Semikolon-Einfügung.
Wirklich eine ganze Menge von JS sollte als schädlich angesehen werden, vielleicht sogar die ganze Sprache, aber die guten Teile sind einfach so verdammt gut, dass es das irgendwie wiedergutmacht (zumindest für mich.)
"Im Hintergrund fehlgeschlagen" in Flash Player als Standardverhalten
Ok, nicht wirklich ein Merkmal der Sprache selbst, aber immer noch ziemlich eng verwandt.
Plötzlich funktioniert Ihre Flash / Flex-Anwendung nicht mehr und niemand kann Ihnen den geringsten Hinweis geben, was mit dem f * geschehen ist. Keine Fehlermeldung, kein Stacktrace, kein Nichts. Es ist nur so, dass der Bildschirmübergang plötzlich nicht (oder auf völlig falsche Weise) erfolgt oder Schaltflächen nicht mehr auf Klicks reagieren oder Comboboxes leer sind, anstatt mit einigen Einträgen gefüllt zu werden.
Dieses "Feature" allein ist für mehrere Achselzucken-Berichte und eine ganze Reihe grauer Haare verantwortlich, die ich bekommen habe. -.- Auch wenn das Auftauchen einer kryptischen Nachricht im Gesicht des Benutzers nicht erwünscht ist, kann dies dem Entwickler zumindest dabei helfen, das Problem zu beheben.
Mit Flash Player bleiben Sie jedoch im Dunkeln und verlassen sich auf die Beschreibung des Benutzers (wobei das Problem möglicherweise von einer ganz anderen Stelle im Code ausgeht, die nichts mit dem zu tun hat, was der Benutzer getan hat). Nur wenn Sie den Debug-Player verwenden, erhalten Sie tatsächlich das Popup-Fenster mit einer Fehlermeldung und einem Stacktrace.
Es kann jedoch sehr interessant sein, auf bestimmten Nachrichtenseiten eingebettete Flash-Filme anzusehen und wiederholt Meldungen über Null-Referenzen von der verwendeten eingebetteten Player-SWF zu erhalten. : D
iPhone Apps stürzen manchmal auch ohne Vorwarnung ab, in bestimmten komischen Zeiten
Ming-Tang
3
Es ist ziemlich mies, in irgendetwas leise zu scheitern .
6
In C / C ++: Diese Zuweisungen sind auch Ausdrücke, die mit den sehr ähnlichen Zuweisungs- und Vergleichsoperatoren KOMBINIERT sind. Per se keine schädliche Funktion, aber es ist viel zu einfach, (manchmal subtile) Fehler einzuführen, indem der Bediener versehentlich falsch getippt wird.
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
... kombiniert mit der Tatsache, dass eine Ganzzahl oder ein Zeiger eine gültige Bedingung ist.
Barjak
5
Zugriffsmodifikatoren in Java mit Standardeinstellungen für die private Programmiersprache und Standardeinstellungen für die private Programmiersprache.
Nun, es ist schon eine Weile her, dass ich LOGO verwendet habe. Warum ist das schädlich?
Mason Wheeler
5
Das Logo kann verwendet werden, um einen realen, physischen Schildkrötenroboter zu steuern. Manchmal möchte man, dass sich die Schildkröte in eine bestimmte Richtung dreht oder mehr als einmal. Vielleicht programmieren Sie es zum Beispiel für eine Art Tanz.
Daniel Cassidy
@Mason, Es sollte ein Witz sein.
JJNGUY
3
Ja, besonders in LOGO For Clocks.
Intuited
1
Ich liebe Logo (siehe programmers.stackexchange.com/questions/21028/… ) und es ist eine ausgezeichnete Unterrichtssprache, insbesondere für junge Leute. Als ich 11 Jahre alt war und zum ersten Mal Logo benutzte, wusste der Großteil meiner Klasse nicht so viel Geometrie, aber sie erfuhren, dass 90 eine Vierteldrehung war und wissen, dass es von links nach rechts geht. Es ist also kein negatives Merkmal - das gleiche wie, warum wir nicht mit Reziprokwerten multiplizieren, anstatt einen Divisionsoperator zu haben. Ja, ich weiß, dass es ein Witz ist.
Orbling
4
Thread von einem anderen Thread stoppen
In Java und in einer anderen Sprache können Sie einen Thread beliebig von einem anderen stoppen, ohne die Zeit anzugeben, die der gestoppte Thread zum ordnungsgemäßen Beenden benötigt. Diese Fähigkeit wurde angesichts der enormen Menge an Problemen, die in nahezu jeder Situation auftreten können, als veraltet eingestuft .
Während ich dies annehmen kann schädlich sein, es gibt Zeiten , es äußerst nützlich ist (zB ein Debugger Einzelschritt und Bruchstellen unterstützen).
Jerry Coffin
1
@ Jerry Debugging ist eine ganz andere Sache, es stoppt den Prozess nicht, es hält ihn an.
HoLyVieR 13.09.10
im gegenteil, es stoppt den thread. Anscheinend redest du davon , den Faden zu töten , aber nicht nur anzuhalten. Das ist etwas schwerer zu rechtfertigen ...
Jerry Coffin
Ich sehe dies jedoch nicht unbedingt als Sprachfeature an. Eher eine Standardbibliotheksache.
Perl ... verfügt wie gewohnt über die (potenziell gefährliche) Funktion, über eine einfache Best-Practice-Methode zum Ausschalten ( use strict) und eine einfache Methode zum erneuten Einschalten in genau den Fällen, in denen Sie dies wünschen ( no strict 'refs').
1
Ich habe nie eine Verwendung gefunden, um einen dynamischen Variablennamen zu haben. Und das einzige Mal, dass ich es tat, machte es den Code unleserlich und einen WTF-Moment später, als ich den Code überarbeitete.
TheLQ
Mmm, Anwendungen beinhalten Metaprogrammierung mit den abscheulichen Paketvariablen anderer Leute oder der Symboltabelle (was wohl ein bisschen anders ist).
1
@ Joe Ich fordere Sie auf, mir ein Beispiel zu zeigen, in dem variable Variablen eine Lösung klarer machen.
Ein guter Fall, als ich etwas von Delphi nach Lazarus portierte und mein TControl-Nachkomme "with Canvas do ... Width, Height" enthielt, das auf die Steuerelementgrößen verweist, aber Lazarus TCanvas hatte seine eigene Width und Delphi, was zu falsch kompiliertem Code führte
In Perl kann es schwierig sein , skalare Kontexte mit Listenkontexten zu vergleichen. Es gibt einige gute Punkte, die bestimmte Operationen bequemer machen, aber gelegentlich stoßen Sie auf etwas Schreckliches, wie das vollständige Ändern der Bedeutung eines Operators (möglicherweise aus einer beträchtlichen Entfernung im Code).
sub foo { (1..5) }
my @list = foo(); # (1,2,3,4,5)
my $length = scalar @list; # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)
Das stimmt einfach nicht.
(Es entsteht aus dem Versuch, etwas zu machen, das sich wie der normale Bereichsoperator verhält, so dass Sie etwas in einer Schleife sagen können wie next if /start_regex/ .. /end_regex/).
Mann das ist so verwirrend. Das Schlimmste daran, Perl zu lernen, war, dass ich mich darum bemühte.
Glenatron
Ich habe immer gedacht, dass alles, was es einer Funktion ermöglicht, auf verschiedene Arten zurückzukehren, praktisch ist.
Orbling
2
Die relative Importsyntax von Python 2.x. Angenommen, ich habe ein Paket x.plugins, das Unterstützung für verschiedene andere Bibliotheken für hinzufügt x. Angenommen, ich habe ein sqlalchemyModul, in dem x.pluginsich SQLalchemy-Unterstützung hinzufügen kann x. Was wird wohl passieren, wenn ich die folgende Zeile zu sqlalchemy.py hinzufüge?
import sqlalchemy
Die Antwort ist, dass das Modul versucht, sich selbst zu importieren. Diese Syntax macht es im Wesentlichen unmöglich, das eigentliche globale sqlalchemy-Paket zu importieren. In Python 2.5 wurde eine Möglichkeit hinzugefügt, anzugeben, dass dies ein relativer Import ist:
from . import sqlalchemy
... aber erst in Python 3 wurde die erste Syntax tatsächlich entfernt (obwohl sie in Python 2.6+ deaktiviert werden kann from __future__ import absolute_import).
sun.misc.unsafe ist mein absoluter Favorit. Die Sammlung von "Wir brauchten dies, um Dinge zu implementieren, aber wirklich, wirklich, denken Sie nicht, dass Sie es verwenden sollten."
Jede gute Sprache sollte ein unsicheres Paket in der Standardbibliothek haben. Der Import dieses Pakets zeigt deutlich, dass Sie beabsichtigen, unportable Dinge auf niedriger Ebene zu tun. Die Alternativen sind: 1- Unsichere Funktionen in der Sprache selbst (z. B. C ++) und 2- Verwenden einer anderen Sprache wie z. B. C für einfache Aufgaben (z. B. Python und Ruby). Der unsichere Paketansatz scheint mir viel besser zu sein.
imgx64
1
FORTRAN gemeinsame Blöcke. Wenn Sie einen einfachen Fehler gemacht haben, kann ein Teil einer Anwendung die globalen Elemente eines anderen Teils beschädigen.
FORTRAN hat die Anweisung goto / COBOL alter zugewiesen. Selbstmodifizierender Code. Gefahr, Warnung, fliegende Spaghetti Monster !!
FORTRAN hatte keine ALTER-Anweisung. FORTRAN hatte die ASSIGN-Anweisung mit dem zugewiesenen GOTO. COBOL hatte die ALTER-Anweisung, die einem ähnlichen Zweck diente.
John R. Strohm
@ John - danke. Meine Erinnerung an Assign / Alter ist schwach ... nicht zuletzt, weil mir beigebracht wurde, sie niemals zu benutzen.
Stephen C
1
Objektorientierung (aus allen statisch typisierten Sprachen). Ich wette, dass diese Funktion weitaus mehr als Nullzeiger kostet und auch weiterhin kosten wird . Objektorientierung ist nur in einer dynamischen Nachrichtenübergabesprache gut . Daher sollte es auch aus dynamischen Sprachen wie Python entfernt werden (da es keine Nachrichtenübermittlung, sondern einen herkömmlichen Unterprogrammaufruf verwendet).
Python unterstützt Smalltalks Message-Passing-Idiom (in jeder Hinsicht). Es ist einfach nicht so benannt. Zweitens denke ich, dass es zumindest ein wenig umstritten ist, solch ein durchdringendes Sprachmerkmal als schädlich zu bezeichnen.
Jason Baker
Die Objektorientierung verbessert weiterhin die Wiederverwendung von Code und die Kapselung von Code und Daten. Unabhängig von der statischen / dynamischen Verwendung der Funktion.
Orbling
@Orbling: Im Vergleich zu was? Meiner Meinung nach haben funktionale Programmiersprachen eine höhere Wiederverwendung von Code und ich denke, dass Haskells Modulsystem für die Codekapselung / Datenkapselung ziemlich gut ist.
LennyProgrammers
@ Lenny222 Im Vergleich zur Standard-Imperativ-Programmierung. Auch ich bevorzuge den funktionalen Ansatz, Haskell ist eine meiner bevorzugten Sprachen.
Orbling
@Jason Baker: Natürlich ist es umstritten, aber so durchdringend zu sein ist genau das, was es so schädlich macht! Das OP fragte nach meiner Meinung und ich gab sie ab. Nur weil ein Haufen Lemminge von einer Klippe springt, ist das Verhalten nicht normal. In diesem Fall ist es mathematisch bewiesen, dass OOP nicht funktioniert, und das richtige Paradigma ist gut akzeptiert: Kategorietheorie ist ein Weg, um Abstraktionen darzustellen (es ist in der Tat die Theorie der Abstraktionen)
Unerfahrene Entwickler verlassen sich entweder darauf, dass es aktiviert ist, und gehen daher davon aus, dass alle Benutzereingaben für die Verwendung in einer SQL-Abfrage ausgeblendet werden, oder sie verlassen sich darauf, dass es deaktiviert ist, und entziehen sich daher immer ihren Eingaben.
Wenn Sie davon ausgehen, dass es aktiviert ist, und den Code dann auf einem System ausführen, auf dem dies nicht der Fall ist, werden große SQL-Injection-Lücken geöffnet.
Wenn angenommen wird, dass es deaktiviert ist und nicht, werden Backslashes tatsächlich in der DB gespeichert, was zu hässlichen / falschen Zeichenfolgen führt.
Es gibt auch keine extrem einfache Möglichkeit, beide Fälle zu behandeln - Sie müssen überprüfen, ob es aktiviert ist, get_magic_quotes_gpc()und dann stripslashes()auf alle Werte in den $_*Arrays anwenden - da array_mapes nicht rekursiv ist, benötigen Sie hierfür eine benutzerdefinierte Funktion.
Das ist keine Funktion, aber es ist ein sehr bekannter Fehler im Benutzer-Frontend. Die meisten Leute kennen ihn unter seinem lateinischen Namen: Homo Sapiens.
Joe D
-3
hier ein bisschen auf die Nerven gehen - leere Funktionen. Eine Funktion tut immer etwas, daher sollte sie entweder das Ergebnis oder eine andere Information über ihren Erfolg oder Misserfolg zurückgeben.
Wenn Sie in einer Sammlung irgendwo Referenzen haben, haben Sie andere Probleme.
Chinmay Kanchi
2
Das ist der Grund, warum gc'ed Sprachen schwache Referenzen haben :)
Chinmay Kanchi
4
Während GC sicherlich sowohl Stärken als auch Schwächen hat, muss ich sagen, dass Mason in dieser Hinsicht mehr richtig als falsch ist. Tatsächlich habe ich gesehen, dass Benutzer von GC viel zusätzliche Zeit für die Speicherverwaltung aufgewendet haben, weil sie letztendlich versucht haben, Dinge nachträglich zu hacken, anstatt sie im Voraus zu planen. GC verhindert im Allgemeinen auch die deterministische Zerstörung, was zu zusätzlicher Arbeit beim Verwalten aller Ressourcen außer dem Speicher führt.
Jerry Coffin
3
@ChaosPandion: Bin ich wirklich ein Idiot, wenn ich der Meinung bin, dass auf einem modernen Multitasking-Computer so schnell wie möglich Speicher freigegeben werden sollte, damit Paging die Systemleistung nicht beeinträchtigt? Kein GC hat es jemals geschafft, dieses Ergebnis auch nur annähernd zu erreichen, und tatsächlich tut der Müllsammler der Generation, der als die beste und modernste Sorte überhaupt gilt, genau das Gegenteil: Für eine optimale Leistung muss er freigegeben werden Erinnerung so spät wie möglich. Ich sehe das nicht als das richtige Werkzeug für irgendeinen Job, nicht wenn es meine anderen Programme verlangsamt. Bin ich ein Idiot dafür?
Mason Wheeler
2
@ Barry: Es ist deterministisch innerhalb des Programms. Wenn ich mit einem 5-KB-Speicherblock fertig bin, fragen Sie kurz danach nach weiteren 5 KB. Was passiert dann? In einem Garbage-Collected-System muss ein neuer 5-KB-Block angefordert werden, obwohl ein perfekter Block ungenutzt ist, es sei denn, der GC wurde in der Zwischenzeit ausgeführt. In diesem Fall können Sie den alten Block recyceln. Mit malloc und free können Sie immer den alten Block recyceln. Multiplizieren Sie dies mit ein paar hunderttausend und es wird ein echtes Problem.
Mason Wheeler
-5
C und definitiv C ++: Zeigerarithmetik. Das Ermöglichen, dass Menschen Ganzzahlen in Speicheradressen konvertieren, ist problematisch.
Und vielleicht sogar roher Zugriff auf Zeiger insgesamt?
In C ++ haben Sie Verweise, die Zeiger fast völlig überflüssig machen. In den übrigen Fällen sollten intelligente Zeiger als obligatorisch betrachtet werden.
Java ist beweist auch , dass Sie kann eine Programmiersprache , die Anwendungen Zeiger , ohne dass Personen Zugriff auf den Zeigerwert selbst machen.
Abgesehen von null... aber das ist eine andere Geschichte.
Zeiger sind zwar manchmal schwierig richtig zu verwenden, aber für eine große Anzahl effizienter Speicheroperationen sehr notwendig.
Bill
1
Wahr. Aber es ist meiner Meinung nach heutzutage meistens schädlich, wenn man es erlaubt, Ganzzahlen regelmäßig in Speicherreferenzen umzuwandeln oder Speicheradressen mit Zahlen zu versehen. In C ++ haben Sie Verweise als eine vollkommen gute Alternative und intelligente Zeiger / automatische Zeiger, wenn Sie wirklich brauchen, dass es ein Zeiger ist.
Asgeir S. Nilsen
4
Diese Antwort ist nur gültig, wenn Sie an einem Software-Stack arbeiten, der Zeiger ausblenden soll. In allen anderen Fällen ist diese Antwort falsch.
Paul Nathan
3
Für einige Programmiersprachen müssen Zeiger verfügbar sein, damit Sie alle Betriebssysteme und virtuellen Maschinen für die anderen Programmiersprachen schreiben können.
2
-1. Es gibt einen Grund, warum Sie ptr-Arithmetik benötigen: Das Iterieren eines Punkts ist schneller als das Indizieren. for(int i=0;i<SIZE;++i) ++arr[i]ist langsamer als for(int*i=arr;i<arr+SIZE;++i)*i++. Alles, was Java zu beweisen vermochte, ist, dass Sie einen Zeiger brauchen, oder haben Sie sich das noch nie angeschaut sun.misc.Unsafe? Wenn Sie keine Zeiger benötigen, erklären Sie bitte, wie Sie eine generische Swap-Funktion mit Java schreiben. (zB int a = 1, b = 2; Swap (a, b); Assert (a == 2 && b == 1);). Ganz zu schweigen von all den Problemen in c / c ++, die Sie haben würden, wenn Sie Referenzen verwenden MÜSSEN. Wie würden Sie eine virtuelle Funktion für eine undurchsichtige Struktur ohne Zeiger aufrufen?
a = 1/0
- Grundausdruck, schädlich. ;-)Antworten:
Registrieren Sie Globals in PHP
Informationen: http://php.net/manual/en/security.globals.php
Dies ist mit Abstand die schlechteste Funktion, die jemals aus Gründen der Lesbarkeit und Sicherheit implementiert wurde. Grundsätzlich werden alle empfangenen GET-Parameter in Variablen umgewandelt.
Zum Beispiel mit dieser URL: /index.php?value=foobar
Sie können Folgendes tun:
Wenn Sie Code lesen, ist es sehr verwirrend zu wissen, woher die Variable kommt.
Auch wenn die Funktion missbraucht wird, kann dies zu Sicherheitslücken führen. Hier ist ein Codebeispiel von php.net, das zeigt, wie es missbraucht werden kann:
quelle
Erlaube standardmäßig Null, den "Billionen" * Dollar Fehler. Entschuldigung Tony Hoare. Fast jede Sprache auf dem Planeten verfügbar.
Tony Hoare erklärt
* Ich habe den Ausdruck von Tony Hoare so angepasst, dass er den tatsächlichen Verlust dieser Tage widerspiegelt :-)
quelle
C- und C ++ - MAKROS. Wenn ich jemals einen anderen Compilerfehler sehen muss, weil jemand einen Standardfunktionsnamen für sein Makro gewählt hat, der meinen Code durcheinander bringt, werde ich schreien. Lassen Sie uns die letzte Beleidigung sehen:
Aaarg! Was hast du mit meinem STL-Vektor gemacht?
quelle
Fallthrough in C- und C ++ - Switch-Anweisungen.
quelle
break
Anweisung vergessen oder jemand einen Fall zwischen zwei Fällen hinzufügt (oder sie neu anordnet), ohne zu bemerken, dass ein Durchfall zwischen ihnen aufgetreten ist . Ich sehe keine Möglichkeit, dass ein Fallthrough besser ist als die C # -Methode, bei der entweder eine Pause oder ein Fall erforderlich ist usw.Implizite Typkonvertierungen, wenn die Typen, zwischen denen konvertiert wird, keine offensichtliche Beziehung haben. Zum Beispiel das Konvertieren einer zufälligen, nicht numerischen
string
in eineint
, wie in PHP.quelle
explicit
, wodurch implizite Typkonvertierungen gestoppt werden. Es gibt jedoch weiterhin Probleme.0
für einen bestimmten Wert zu haben.goto : Obwohl es in seltenen Fällen in Ordnung ist, wird es häufiger missbraucht und führt zu schwer lesbaren Programmen.
quelle
KEINER
Nur weil eine Funktion häufig missbraucht wird, ist sie nicht schädlich.
IMHO ist das gesamte "als schädlich" die Reductio ad Hitlerum der Programmiersprachendiskussionen.
Die meisten, wenn nicht alle "schädlichen" Merkmale haben oder hatten ursprünglich einen sehr gültigen Anwendungsfall oder sind in erster Linie einfach Bequemlichkeitsmethoden. Es liegt an den Entwicklern, die Vor- und Nachteile und den Code entsprechend zu verstehen.
Wenn Ihre Fragen so aussehen sollten, wie "Welche Sprachmerkmale haben gemeinsame Fallstricke oder unglückliche Nebenwirkungen?", Wäre meine Antwort anders.
[edit] Um es klar zu sagen: Ich meine nicht die fortgesetzte Verwendung veralteter Methoden. Wenn die Entwickler eine Funktion abwerten / entfernen, sollten Sie den Ersatz verwenden. Ich beziehe mich auf das Konzept, dass ein aktueller Teil der Sprache als schädlich eingestuft wird, weil einige nicht mögen, was er fördert, oder den Kompromiss, der damit verbunden ist, dass viele Leute darüber diskutieren.
quelle
Autovivification (oder ein anderes Bind-Variable-On- (Assign | Use) -Feature) ist das Feature, von dem ich festgestellt habe, dass es die meisten Fehler verursacht.
quelle
PLEASE
in INTERCAL. Verwenden Sie es nicht genug, es beschwert sich. Verwenden Sie es zu viel, es beschwert sich.quelle
Obwohl einige Leute mit dem Mann oder verschiedenen Dingen, die er sagt, nicht einverstanden sind, bezieht sich eine Menge von Douglas Crockfords JavaScript: The Good Parts im Grunde auf diese Frage bei JS. Zu Crockfords Beschwerden gehören:
Standardmäßig globaler Gültigkeitsbereich für alles (DC zeigt, wie Funktionen / Objekte als Namespaces und Gültigkeitsbereichsbegrenzer verwendet werden, um dies in Konflikt zu bringen.)
Anweisungen wie
with
, deren Fehlverhalten darin besteht, Dinge im globalen Namespace zu definieren. (Gah! Es ist wie das JS-Motto, wenn Sie scheitern, dann scheitern Sie so schwer wie möglich !)Unerwartetes Verhalten mit dem
==
Operator, sodass Sie den Operator grundsätzlich immer verwenden müssen===
.Semikolon-Einfügung.
Wirklich eine ganze Menge von JS sollte als schädlich angesehen werden, vielleicht sogar die ganze Sprache, aber die guten Teile sind einfach so verdammt gut, dass es das irgendwie wiedergutmacht (zumindest für mich.)
quelle
"Im Hintergrund fehlgeschlagen" in Flash Player als Standardverhalten
Ok, nicht wirklich ein Merkmal der Sprache selbst, aber immer noch ziemlich eng verwandt.
Plötzlich funktioniert Ihre Flash / Flex-Anwendung nicht mehr und niemand kann Ihnen den geringsten Hinweis geben, was mit dem f * geschehen ist. Keine Fehlermeldung, kein Stacktrace, kein Nichts. Es ist nur so, dass der Bildschirmübergang plötzlich nicht (oder auf völlig falsche Weise) erfolgt oder Schaltflächen nicht mehr auf Klicks reagieren oder Comboboxes leer sind, anstatt mit einigen Einträgen gefüllt zu werden.
Dieses "Feature" allein ist für mehrere Achselzucken-Berichte und eine ganze Reihe grauer Haare verantwortlich, die ich bekommen habe. -.- Auch wenn das Auftauchen einer kryptischen Nachricht im Gesicht des Benutzers nicht erwünscht ist, kann dies dem Entwickler zumindest dabei helfen, das Problem zu beheben.
Mit Flash Player bleiben Sie jedoch im Dunkeln und verlassen sich auf die Beschreibung des Benutzers (wobei das Problem möglicherweise von einer ganz anderen Stelle im Code ausgeht, die nichts mit dem zu tun hat, was der Benutzer getan hat). Nur wenn Sie den Debug-Player verwenden, erhalten Sie tatsächlich das Popup-Fenster mit einer Fehlermeldung und einem Stacktrace.
Es kann jedoch sehr interessant sein, auf bestimmten Nachrichtenseiten eingebettete Flash-Filme anzusehen und wiederholt Meldungen über Null-Referenzen von der verwendeten eingebetteten Player-SWF zu erhalten. : D
quelle
In C / C ++: Diese Zuweisungen sind auch Ausdrücke, die mit den sehr ähnlichen Zuweisungs- und Vergleichsoperatoren KOMBINIERT sind. Per se keine schädliche Funktion, aber es ist viel zu einfach, (manchmal subtile) Fehler einzuführen, indem der Bediener versehentlich falsch getippt wird.
quelle
Zugriffsmodifikatoren in Java mit Standardeinstellungen für die private Programmiersprache und Standardeinstellungen für die private Programmiersprache.
quelle
Ersetzen nicht definierte Variablen durch einen leeren String in der Schale ohne Warnungen:
rm -rf $nosuchvar/*
.quelle
${varname:-/dev/null}
kann eine Problemumgehung sein ...Die Möglichkeit, in LOGO gegen den Uhrzeigersinn zu drehen. Wtf, lass uns einfach im Uhrzeigersinn drehen
360 - x
.quelle
Thread von einem anderen Thread stoppen
In Java und in einer anderen Sprache können Sie einen Thread beliebig von einem anderen stoppen, ohne die Zeit anzugeben, die der gestoppte Thread zum ordnungsgemäßen Beenden benötigt. Diese Fähigkeit wurde angesichts der enormen Menge an Problemen, die in nahezu jeder Situation auftreten können, als veraltet eingestuft .
quelle
Variable Variablen in PHP
Nur weil du dich
$can
nicht meinst$$should
quelle
use strict
) und eine einfache Methode zum erneuten Einschalten in genau den Fällen, in denen Sie dies wünschen (no strict 'refs'
).Die
With
Aussage in Delphi kommt in den Sinn, obwohl es Fälle gibt, in denen es nützlich ist.quelle
Arrays in AWK ab Index 1 !
quelle
car
! : PIn Perl kann es schwierig sein , skalare Kontexte mit Listenkontexten zu vergleichen. Es gibt einige gute Punkte, die bestimmte Operationen bequemer machen, aber gelegentlich stoßen Sie auf etwas Schreckliches, wie das vollständige Ändern der Bedeutung eines Operators (möglicherweise aus einer beträchtlichen Entfernung im Code).
Das stimmt einfach nicht.
(Es entsteht aus dem Versuch, etwas zu machen, das sich wie der normale Bereichsoperator verhält, so dass Sie etwas in einer Schleife sagen können wie
next if /start_regex/ .. /end_regex/
).quelle
Die relative Importsyntax von Python 2.x. Angenommen, ich habe ein Paket
x.plugins
, das Unterstützung für verschiedene andere Bibliotheken für hinzufügtx
. Angenommen, ich habe einsqlalchemy
Modul, in demx.plugins
ich SQLalchemy-Unterstützung hinzufügen kannx
. Was wird wohl passieren, wenn ich die folgende Zeile zu sqlalchemy.py hinzufüge?Die Antwort ist, dass das Modul versucht, sich selbst zu importieren. Diese Syntax macht es im Wesentlichen unmöglich, das eigentliche globale sqlalchemy-Paket zu importieren. In Python 2.5 wurde eine Möglichkeit hinzugefügt, anzugeben, dass dies ein relativer Import ist:
... aber erst in Python 3 wurde die erste Syntax tatsächlich entfernt (obwohl sie in Python 2.6+ deaktiviert werden kann
from __future__ import absolute_import
).quelle
sun.misc.unsafe ist mein absoluter Favorit. Die Sammlung von "Wir brauchten dies, um Dinge zu implementieren, aber wirklich, wirklich, denken Sie nicht, dass Sie es verwenden sollten."
quelle
FORTRAN gemeinsame Blöcke. Wenn Sie einen einfachen Fehler gemacht haben, kann ein Teil einer Anwendung die globalen Elemente eines anderen Teils beschädigen.
FORTRAN hat die Anweisung goto / COBOL alter zugewiesen. Selbstmodifizierender Code. Gefahr, Warnung, fliegende Spaghetti Monster !!
quelle
Objektorientierung (aus allen statisch typisierten Sprachen). Ich wette, dass diese Funktion weitaus mehr als Nullzeiger kostet und auch weiterhin kosten wird . Objektorientierung ist nur in einer dynamischen Nachrichtenübergabesprache gut . Daher sollte es auch aus dynamischen Sprachen wie Python entfernt werden (da es keine Nachrichtenübermittlung, sondern einen herkömmlichen Unterprogrammaufruf verwendet).
quelle
magic_quotes
in PHP .Unerfahrene Entwickler verlassen sich entweder darauf, dass es aktiviert ist, und gehen daher davon aus, dass alle Benutzereingaben für die Verwendung in einer SQL-Abfrage ausgeblendet werden, oder sie verlassen sich darauf, dass es deaktiviert ist, und entziehen sich daher immer ihren Eingaben.
Wenn Sie davon ausgehen, dass es aktiviert ist, und den Code dann auf einem System ausführen, auf dem dies nicht der Fall ist, werden große SQL-Injection-Lücken geöffnet.
Wenn angenommen wird, dass es deaktiviert ist und nicht, werden Backslashes tatsächlich in der DB gespeichert, was zu hässlichen / falschen Zeichenfolgen führt.
Es gibt auch keine extrem einfache Möglichkeit, beide Fälle zu behandeln - Sie müssen überprüfen, ob es aktiviert ist,
get_magic_quotes_gpc()
und dannstripslashes()
auf alle Werte in den$_*
Arrays anwenden - daarray_map
es nicht rekursiv ist, benötigen Sie hierfür eine benutzerdefinierte Funktion.quelle
Die Sprachfunktion, mit der Programmierer unkommentierten oder sinnlos kommentierten Code schreiben können.
quelle
hier ein bisschen auf die Nerven gehen - leere Funktionen. Eine Funktion tut immer etwas, daher sollte sie entweder das Ergebnis oder eine andere Information über ihren Erfolg oder Misserfolg zurückgeben.
quelle
POKE in BASIC ...
quelle
Ich muss Müllabfuhr sagen. Es beseitigt nicht die Notwendigkeit, über Speicherverwaltung nachzudenken, aber es beseitigt die Wahrnehmung der Notwendigkeit, über Speicherverwaltung nachzudenken, was allzu oft den eigentlichen Gedanken beseitigt, und dann bekommt man enorme Ressourcenfresser und weiß nicht warum. Vor allem, wenn das Verhalten moderner Generationen-GCs ohnehin ohne allzu große Übertreibung als "ein großes Speicherverlust durch Design" beschrieben werden könnte.
quelle
C und definitiv C ++: Zeigerarithmetik. Das Ermöglichen, dass Menschen Ganzzahlen in Speicheradressen konvertieren, ist problematisch.
Und vielleicht sogar roher Zugriff auf Zeiger insgesamt?
In C ++ haben Sie Verweise, die Zeiger fast völlig überflüssig machen. In den übrigen Fällen sollten intelligente Zeiger als obligatorisch betrachtet werden.
Java ist beweist auch , dass Sie kann eine Programmiersprache , die Anwendungen Zeiger , ohne dass Personen Zugriff auf den Zeigerwert selbst machen.
Abgesehen von
null
... aber das ist eine andere Geschichte.quelle
for(int i=0;i<SIZE;++i) ++arr[i]
ist langsamer alsfor(int*i=arr;i<arr+SIZE;++i)*i++
. Alles, was Java zu beweisen vermochte, ist, dass Sie einen Zeiger brauchen, oder haben Sie sich das noch nie angeschautsun.misc.Unsafe
? Wenn Sie keine Zeiger benötigen, erklären Sie bitte, wie Sie eine generische Swap-Funktion mit Java schreiben. (zB int a = 1, b = 2; Swap (a, b); Assert (a == 2 && b == 1);). Ganz zu schweigen von all den Problemen in c / c ++, die Sie haben würden, wenn Sie Referenzen verwenden MÜSSEN. Wie würden Sie eine virtuelle Funktion für eine undurchsichtige Struktur ohne Zeiger aufrufen?