Bitte erklären Sie warum und listen Sie auf, in welchen Sprachen die (falsche) Funktion implementiert ist.
Geben Sie an, was Sie als schädlich erachten, und nicht, was Sie nicht mögen.
a = 1/0
- Grundausdruck, schädlich. ;-)
Bitte erklären Sie warum und listen Sie auf, in welchen Sprachen die (falsche) Funktion implementiert ist.
Geben Sie an, was Sie als schädlich erachten, und nicht, was Sie nicht mögen.
a = 1/0
- Grundausdruck, schädlich. ;-)
Antworten:
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:
<?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";
}
?>
Erlaube standardmäßig Null, den "Billionen" * Dollar Fehler. Entschuldigung Tony Hoare. Fast jede Sprache auf dem Planeten verfügbar.
* Ich habe den Ausdruck von Tony Hoare so angepasst, dass er den tatsächlichen Verlust dieser Tage widerspiegelt :-)
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:
#define vector(int) new VARIANT[int];
Aaarg! Was hast du mit meinem STL-Vektor gemacht?
Fallthrough in C- und C ++ - Switch-Anweisungen.
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 eine int
, wie in PHP.
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.
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.
Autovivification (oder ein anderes Bind-Variable-On- (Assign | Use) -Feature) ist das Feature, von dem ich festgestellt habe, dass es die meisten Fehler verursacht.
PLEASE
in INTERCAL. Verwenden Sie es nicht genug, es beschwert sich. Verwenden Sie es zu viel, es beschwert sich.
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.)
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
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();
}
Zugriffsmodifikatoren in Java mit Standardeinstellungen für die private Programmiersprache und Standardeinstellungen für die private Programmiersprache.
Ersetzen nicht definierte Variablen durch einen leeren String in der Schale ohne Warnungen: rm -rf $nosuchvar/*
.
${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
.
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 .
Variable Variablen in PHP
Nur weil du dich $can
nicht meinst$$should
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.
Arrays in AWK ab Index 1 !
car
! : P
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/
).
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 sqlalchemy
Modul, in dem x.plugins
ich 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."
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 !!
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).
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_map
es nicht rekursiv ist, benötigen Sie hierfür eine benutzerdefinierte Funktion.
Die Sprachfunktion, mit der Programmierer unkommentierten oder sinnlos kommentierten Code schreiben können.
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.
POKE in BASIC ...
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.
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.
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?