제발 이유를 설명 까지 아시다시피 언어는 (잘못) 기능 구현이있는 및 목록입니다.
싫어하는 것이 아니라 유해한 기능을 고려한 내용을 게시하십시오.
a = 1/0
-기본 표현, 유해합니다. ;-)
제발 이유를 설명 까지 아시다시피 언어는 (잘못) 기능 구현이있는 및 목록입니다.
싫어하는 것이 아니라 유해한 기능을 고려한 내용을 게시하십시오.
a = 1/0
-기본 표현, 유해합니다. ;-)
답변:
정보 : http://php.net/manual/en/security.globals.php
가독성 및 보안상의 이유로 구현할 수있는 최악의 기능입니다. 기본적으로 수신 된 모든 GET 매개 변수는 변수로 변환됩니다.
예를 들어이 URL : /index.php?value=foobar
다음을 수행 할 수 있습니다.
<?php
echo $value; // return foobar
?>
코드를 읽을 때 변수의 출처를 아는 것은 매우 혼란 스럽습니다.
또한이 기능을 잘못 사용하면 보안 허점으로 이어질 수 있습니다. 다음은 php.net에서 코드를 잘못 사용하는 방법을 보여주는 코드 예제입니다.
<?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";
}
?>
기본적으로 "조"* 달러의 실수 인 Null을 허용하십시오. 죄송합니다. Tony Hoare. 지구상에서 사용 가능한 거의 모든 언어.
* 요즘 실제 손실을 반영하기 위해 Tony Hoare가 만든 표현을 조정했습니다.
C 및 C ++ 매크로. 누군가가 내 코드를 망쳐 놓는 매크로의 표준 함수 이름을 선택하여 다른 컴파일러 오류가 발생하면 비명을 지 릅니다. 마지막으로 문제가되는 것을 보자 :
#define vector(int) new VARIANT[int];
아아 아르! 내 STL 벡터로 무엇을 했습니까!?
C 및 C ++ 스위치 문에서 기본적으로 오류가 발생했습니다.
break
진술 을 잊어 버릴 때까지 또는 누군가 두 사건 사이에 오류가 있음을 알지 못하고 두 사건 사이에 사건을 추가하거나 순서를 다시 지정할 때까지 도움 이됩니다. C # 방식으로 중단 또는 이동 사례를 요구하는 것보다 실패가 더 나은 방법은 없습니다.
유형 간 변환시 암시 적 유형 변환에 명확한 관계가 없습니다. 예를 들어, PHP와 같이 임의의 숫자 string
가 아닌 임의의를로 변환합니다 int
.
explicit
암시 적 유형 변환을 중지 하는 변환 함수를 정의 할 수 있지만 여전히 문제가 있습니다.
0
특정 값에 임의의 값을 갖는 것보다 낫습니다 .
goto : 드물지만 괜찮지 만 잘못 사용되어 프로그램을 읽기가 어렵습니다.
없음
기능이 자주 오용 되더라도 유해하지는 않습니다.
IMHO 전체는 "유해한 것으로 간주된다"는 프로그래밍 언어 토론 의 Reductio ad Hitlerum 입니다.
전부는 아니지만 대부분의 "유해한"기능은 매우 유효한 사용 사례를 갖거나 원래 가지고 있거나 단순히 편리한 방법입니다. 이에 따라 장단점을 이해하는 것은 개발자의 몫입니다.
귀하의 질문이 "어떤 언어 기능에 일반적인 함정이나 불행한 부작용이 있는가"라는 문구를 따라야한다면 제 답변은 다를 것입니다.
[편집] 명확하게 : 나는 더 이상 사용되지 않는 방법을 계속 사용한다는 의미는 아닙니다. 개발자가 기능을 감가 상각 / 제거하는 경우 대체를 사용해야합니다. 나는 언어의 현재 부분이 해로운 것으로 간주된다는 개념을 언급하고 있는데, 그 이유는 일부 사람들이 권장하는 것을 좋아하지 않거나 많은 사람들이 논의하는 언어 사용과 관련된 상충 관계 때문입니다.
Autovivification (또는 다른 bind-variable-on- (assign | use) 기능)은 내가 가장 많은 버그를 발견 한 기능입니다.
PLEASE
INTERCAL에서 그것을 충분히 사용하지 않으면 불평합니다. 너무 많이 사용하면 불평합니다.
일부 사람들은 그가 말하는 사람이나 다양한 말에 동의하지 않지만 많은 Douglas Crockford의 JavaScript : The Good Parts 는 기본적으로 JS에 적용되는 질문입니다. Crockford의 불만 중 :
기본적으로 모든 범위에 대한 전역 범위 (DC는 함수 / 객체를 네임 스페이스 및 범위 구분자로 사용하여이를 묶는 방법을 보여줍니다.)
with
글로벌 네임 스페이스에서 사물을 정의하는 데 실패한 동작 과 같은 명령문 (Gah! JS 모토는 실패하면 가능한 한 열심히 실패하는 것과 같습니다 !)
==
연산자의 예기치 않은 동작으로 , 기본적으로 항상 ===
연산자를 사용해야합니다 .
세미콜론 삽입
실제로 많은 JS가 해로운 것으로 간주되어야 할 것입니다. 심지어 전체 언어 일 수도 있지만, 좋은 부분은 너무나 대담하여 그것을 보완합니다 (적어도 나를 위해).
실제로 언어 자체의 기능은 아니지만 여전히 밀접한 관련이 있습니다.
갑자기 Flash / Flex 응용 프로그램이 작동을 멈추고 아무도 f *가 발생했는지에 대한 힌트를 줄 수 없습니다. 오류 메시지 없음, 스택 추적 없음, 아무것도 없음. 갑자기 화면 전환이 발생하지 않거나 완전히 잘못된 방식으로 발생하거나 버튼이 더 이상 클릭에 반응하지 않거나 콤보 상자가 일부 항목으로 채워지는 대신 비어 있습니다.
그 "기능"만으로도 몇 가지 어깨를 으 reports 보고서 와 내가 얻은 많은 흰머리가 있습니다. -.- 사용자의 얼굴에 암호 메시지를 표시하는 것은 바람직하지 않지만 개발자가 문제를 해결하는 데 도움이 될 수 있습니다.
그러나 Flash Player는 사용자의 설명에 의존하여 어둠 속에서 찌르는 것을 남겨 둡니다 (문제는 실제로 사용자의 작업과 관련이없는 코드의 완전히 다른 위치에서 발생할 수 있음). 디버그 플레이어를 사용하는 경우에만 실제로 오류 메시지와 스택 추적이 포함 된 팝업 창이 나타납니다.
그러나 특정 뉴스 사이트에서 플래시 임베디드 영화를보고 사용 된 임베디드 플레이어 SWF에서 Null 참조에 대한 메시지를 반복해서받는 것이 매우 흥미로울 수 있습니다. :디
C / C ++에서 :이 할당은 또한 매우 유사한 할당 = 및 비교 == 연산자와 결합 된 표현식입니다. 그 자체로는 유해한 기능은 아니지만 실수로 작업자를 잘못 공격하여 버그를 쉽게 도입 할 수 있습니다 (때로는 미묘한).
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
로고에서 시계 반대 방향으로 돌리는 기능. Wtf, 시계 방향으로 돌리십시오 360 - x
.
Java 및 다른 언어에서는 중지 한 스레드에 대한 시간을 제공하지 않고 다른 스레드에서 스레드를 임의로 중지 할 수 있습니다. 거의 모든 상황에서 발생할 수있는 엄청난 양의 문제를 고려하면 이 기능은 더 이상 사용되지 않습니다 .
PHP의 변수 변수
당신 $can
이 당신을 의미하지 않기 때문에$$should
use strict
쉬운 방법 ( )과 원하는 경우에 다시 켜는 쉬운 방법이 있습니다 ( no strict 'refs'
).
인덱스 1 에서 시작하는 AWK의 배열 !
car
! : P
Perl에서 스칼라 컨텍스트와 목록 컨텍스트 는 까다로울 수 있습니다. 특정 작업을 편리하게 수행 할 수있는 좋은 점이 있지만 때로는 연산자의 의미를 완전히 변경하는 것 (잠재적으로 코드에서 멀리 떨어져 있음) 과 같은 끔찍한 일이 발생할 수 있습니다.
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)
그건 옳지 않아
(정규 범위 연산자와 같은 역할을하는 무언가를 만들려고하면 루프와 같은 것을 말할 수 있습니다 next if /start_regex/ .. /end_regex/
).
Python 2.x의 상대적 가져 오기 구문. 에 x.plugins
대한 다양한 다른 라이브러리에 대한 지원을 추가 하는 패키지 가 있다고 가정 합니다 x
. 그리고 sqlalchemy
모듈에 x.plugins
sqlalchemy 지원을 추가 할 수 있다고 가정 합니다 x
. sqlalchemy.py에 다음 줄을 추가하면 어떻게 될까요?
import sqlalchemy
답은 모듈이 스스로 가져 오기를 시도한다는 것입니다. 이 구문은 실제 글로벌 sqlalchemy 패키지를 가져 오는 것을 불가능하게합니다. Python 2.5는 이것이 상대적 가져 오기임을 지정하는 방법을 추가했습니다.
from . import sqlalchemy
...하지만 첫 번째 구문이 실제로 제거 된 것은 Python 3 이전이 아닙니다 (Python 2.6 이상에서는 비활성화 할 수는 있지만 from __future__ import absolute_import
).
sun.misc.unsafe 는 내가 가장 좋아하는 것입니다. "우리는 이것을 구현하기 위해 이것이 필요했지만 실제로는 그것을 사용해야한다고 생각하지 않습니다."
FORTRAN 공통 블록. 간단한 실수를 한 경우 응용 프로그램의 한 부분이 다른 부분의 전역을 방해 할 수 있습니다.
FORTRAN에 지정된 goto 문 / COBOL alter 문 자체 수정 코드. 위험, 경고, 비행 스파게티 몬스터 !!
객체 지향 (정적으로 형식화 된 모든 언어에서) 이 기능은 널 포인터보다 훨씬 많은 비용이 들며 앞으로도 계속 될 것 입니다. 객체 방향은 동적 메시지 전달 에서만 유효합니다. 언어 합니다. 따라서 파이썬과 같은 동적 언어에서도 삭제해야합니다 (메시지 전달을 사용하지 않고 기존의 서브 루틴 호출이기 때문에).
경험이없는 개발자는이를 사용 가능하게하여 SQL 조회에 사용하기 위해 모든 사용자 입력을 이탈한다고 가정하거나 사용 불가능하게하여 항상 입력을 이탈합니다.
코드가 활성화되었다고 가정하고 그렇지 않은 시스템에서 코드를 실행하면 넓은 SQL 주입 구멍이 벌어집니다.
비활성화되어 있고 그렇지 않다고 가정하면 실제로 백 슬래시가 DB에 저장되어 못생긴 / 잘못된 문자열이 발생합니다.
두 경우 모두를 처리하는 매우 간단한 방법은 없습니다. 사용 여부를 확인한 get_magic_quotes_gpc()
다음 배열의 stripslashes()
모든 값에 적용 해야합니다. 재귀 적이 지 않으므로 사용자 정의 함수가 필요합니다.$_*
array_map
프로그래머가 주석이 없거나 의미가없는 주석 코드를 작성할 수있는 언어 기능입니다.
무효 기능-여기 사지에 약간 외출. 함수는 항상 무언가를 수행하므로 결과 또는 성공 또는 실패에 관한 다른 정보를 반환해야합니다.
가비지 콜렉션을 말해야합니다. 메모리 관리에 대해 생각할 필요가 없지만 메모리 관리에 대한 생각이 필요하지 않습니다. 메모리 관리에 대한 생각이 너무 자주 없어져서 엄청난 자원이 낭비되고 그 이유를 모릅니다. 특히 현대 세대 GC의 동작이 너무 과장되지 않고 "설계 상 하나의 큰 메모리 누수"로 설명 될 수있을 때.
C, 그리고 확실히 C ++ : 포인터 산술. 사람들이 정수를 메모리 주소로 변환하도록 허용하는 것은 문제를 요구합니다.
그리고 아마도 포인터에 대한 원시 액세스조차 가능합니까?
C ++에는 포인터를 거의 불필요하게 만드는 참조가 있습니다. 나머지 경우 스마트 포인터는 필수로 간주해야합니다.
자바는 또한 당신이 할 수 있음을 증명합니다 사람들이 포인터 값 자체에 액세스하지 않고도 포인터를 사용하는 프로그래밍 언어를 만들 합니다.
그 외에도 null
...하지만 다른 이야기입니다.
for(int i=0;i<SIZE;++i) ++arr[i]
보다 느립니다 for(int*i=arr;i<arr+SIZE;++i)*i++
. 입증 된 모든 Java는 포인터가 필요하거나 보지 않았다는 것입니다 sun.misc.Unsafe
. 포인터가 필요하지 않은 경우 Java를 사용하여 일반 스왑 함수를 작성하는 방법을 설명하십시오. (예 : int a = 1, b = 2; swap (a, b); assert (a == 2 && b == 1);). 참조를 사용해야한다면 c / c ++의 모든 문제는 말할 것도 없습니다. 포인터가없는 불투명 구조체에서 가상 함수를 어떻게 호출합니까?