실행 중에 출력 파일을 삭제하는 것과 같이, sw의 두 인스턴스를 같은 입출력으로 보내는 등?사용자가 런타임에 파일을 썼을 때 데스크탑 응용 프로그램이 끔찍하게 파괴되는 것을 방지하려면 어떻게합니까?
답변
사용자가 그렇게하지 못하게 할 수는 없지만 defensive programming을 적용하면됩니다.
두 가지 예제에서 리소스에 액세스 할 때마다 오류 조건을 감지하고 예외를 throw하고 해당 리소스에 대한 액세스없이 죽어 가거나 계속해서 반응해야합니다.
리소스 할당이 성공한다고 가정하지 마십시오. 사용자가 제어하지 않는 것을 항상 확인하십시오. 즉, 은 가능한 한 작게 가정하고 모든 내용을 확인합니다..
'이 파일에 액세스하려면이 파일에 액세스해야합니다. 이미 열려 있니? 권한이 있습니까? 예상 된 형식입니까? 디스크에 충분한 공간이 있습니까? 기타.'
더 많은 내용이 있습니다. 방어 프로그래밍을위한 Google 만 있으면 많은 정보를 얻을 수 있습니다.
아무 것도 가정하지 마십시오. 매번 IO를 사용하는 모든 작업을 확인하십시오. 빌드 인 검사를 통해 IO에 소프트웨어를 추가로 배치하십시오.
각 텍스트 상자에 최대 입력 길이를 넣거나 UI의 컨트롤을 편집하십시오. 유효하지 않은 데이터 (예 : 숫자가 예상되는 곳의 편집 텍스트)를 입력하고 그런 종류의 입력을 확인/처리하는 일반적인 방법을 테스트합니다.
검색어를 통한 SQL 주입 공격에 대해서도 생각해보십시오. 예 : 성이 ___ 인 사용자를 찾고 사용자가 "* smith"라고 입력하십시오. select * from users * "데이터베이스 계층은 무엇을 할 것입니까?
사용자가 입력 한 데이터가 다시 표시되거나 (악화되면 다른 사용자에게) 마크 업이나 컨트롤을 포함 할 수 있는지 확인하십시오 시퀀스가 표시 될 때 UI를 남용 할 수 있습니다.
대상이되는 OS와 언어는 밝히지 않지만 실행에 필요한 최소한의 권한을 응용 프로그램에 제공하십시오. 예를 들어 .Net, 선언적 보안 속성을 살펴보십시오. 즉, 공격자가 앱을 제어 할 수 있다면 피해가 적습니다.
의도적으로 잘못된 입력을 사용하여 단위 테스트를 생성합니다. 응용 프로그램이 그것을 처리 할 수 있는지 확인하십시오.
사람들이 한 가지 들어 본 것은 VirtualPC 아래의 신뢰할 수없는 물건을 실행하여 기본 시스템이 무엇이든 손상되지 않도록합니다.
여기에 몇 가지 좋은 답변이 있습니다. 그러나 당신이 방어해야 할 대상을 고려해야한다고 생각합니다.
프로그램을 사용하려는 사람들이 프로그램을 사용하려고합니까? 그렇다면, 당신은 사보타지보다는 어리 석음 (실용 범위까지)을 방어해야합니다. 모든 입력을 계속 확인하고 싶지만 사용자가 어리석은 짓을하는 경우 최적의 결과를 얻지 않는 것이 합리적입니다. 사용자가 시스템에 액세스 할 수있는 경우 출력 파일을 삭제하는 등의 작업을 방지 할 수 없으므로 코드를 작성할 수 없습니다. 교육 문제 일뿐입니다.
사람이 펀치 인/아웃 할 때를 기록하는 시간 기록 응용 프로그램과 같이 프로그램을 사용하지 않으려는 사람들이 프로그램을 사용하게됩니까? 누군가는 물리적 보안 (상업용 버전은 악용을 많이 감수하도록 설계됨)과 소프트웨어 보안 (아무도 시간을 변경할 수 없음)을 고려해야합니다. 매우 간단한 인터페이스를 제공하고 입력을 자세히 확인해야합니다.
"사용자가 시스템에 액세스 할 수있는 경우 출력 파일을 삭제하는 등의 작업을 할 수 없으므로 코드를 작성할 수 없습니다." <--- 예를 들어 프로그램을 정상적으로 종료하지 않고 프로그램을 정상적으로 종료 할 수 있는지 확인해야합니다. –
사용자 테스팅을 시뮬레이트하는 데 유용한 테스터가 있다면 어떨까요?
이것은 까다로운 질문입니다. 사용자 (심지어 멍청한 사람)는 결코 고려하지 않은 방식으로 응용 프로그램을 사용하는 것에 대해 영리합니다.
나는 (Vinko가 위에서 언급 한) 방어 프로그래밍의 큰 팬이다. 위험 분석의 관점에서 접근 할 수 있습니다. 응용 프로그램에서 사용하는 리소스를보고 파일, 장치, 데이터 등을 수정하고 해당 리소스에 잘못 될 수있는 내용을 브레인 잡고 주위를 계획하십시오.
예를 들어 전용 하드웨어 리소스가 있고 응용 프로그램의 여러 인스턴스가 각각 해당 리소스에 대해 경합하는 경우 사용자가 둘 이상의 인스턴스를 실행할 수 없도록 응용 프로그램에 대한 단일 패턴을 적용 할 수 있습니다. 불량의 종류를 뜻 :이 모든
은 우리가 :)
- 1. mod_wsgi django 응용 프로그램이 반복적으로 다시로드되는 것을 방지하려면 어떻게합니까?
- 2. 파일을 대체하는 동안 웹 응용 프로그램이 손상되는 것을 방지하려면 어떻게해야합니까?
- 3. 디버깅 할 때 전체 화면 이중 버퍼링 응용 프로그램이 화면이 멈추는 것을 방지하려면 어떻게합니까?
- 4. 내 사용자가 /.../index.php에 명시 적으로 서핑하는 것을 방지하려면 어떻게합니까?
- 5. 응용 프로그램 데이터 파일을 제거 할 때 설치 프로그램이 실행되지 않도록 방지하려면 어떻게합니까?
- 6. 텍스처가 파괴되는 것을 감지하는 방법
- 7. 사용자가 잘못된 입력을 입력하는 것을 방지하려면 어떻게해야합니까?
- 8. 사용자가 양식을 클릭 할 때 양식이 활성화되는 것을 방지하려면 어떻게해야합니까?
- 9. IE8의 크기를 조정할 때 페이지의 왼쪽면이 잘리는 것을 방지하려면 어떻게합니까?
- 10. 입력 할 때 UITextfield 글꼴 크기가 작아지는 것을 방지하려면 어떻게합니까?
- 11. 값이 #으로 표시되는 것을 방지하려면 어떻게합니까?
- 12. 사용자가 특정 양식을 페이지에서 나가는 것을 방지하려면 어떻게해야합니까?
- 13. 파일을 복사 할 때이 System.IO.IOException을 방지하려면 어떻게합니까?
- 14. 사용자가 Outlook을 닫고 내 응용 프로그램이 OLE 자동화를 사용 중일 때 "RPC 서버를 사용할 수 없음"을 방지하려면 어떻게합니까?
- 15. JQuery 애니메이션 호출이 대기열에 들어가는 것을 방지하려면 어떻게합니까?
- 16. 응용 프로그램이 파일을 실행하고 \ 실행하려고하는 것을 인식하는 방법?
- 17. Silverlight보기에서 깜박임을 방지하려면 어떻게합니까?
- 18. Microsoft.SPOT.Hardware.InterruptPort의 잘못된 구성을 방지하려면 어떻게합니까?
- 19. Eclipse가 make 대신 nmake 파일을 생성하는 것을 방지하려면 어떻게해야합니까?
- 20. 사용자가 실수로 Cocoa에서 드래그를 시작하는 것을 방지하려면 어떻게해야합니까?
- 21. 사용자가 텍스트 상자의 처음 부분에 공백을 입력하는 것을 방지하려면 어떻게해야합니까?
- 22. PHP - 동시에 여러 컴퓨터에서 사용자가 로그인하는 것을 방지하려면 어떻게해야합니까?
- 23. Django Admin 사용자가 다른 Admin 사용자의 프로필 데이터를 변경하는 것을 방지하려면 어떻게합니까?
- 24. 사용자가 "보기 소스"를 사용하여 내 PHP 코드를보고 복사하는 것을 방지하려면 어떻게합니까?
- 25. CompileAssemblyFromSource가 메모리 누수를 방지하려면 어떻게합니까?
- 26. 저장된 proc 중간 레코드 집합을 반환하는 것을 방지하려면 어떻게합니까?
- 27. iPhone OS가 화면을 끄거나 대기 모드로 들어가는 것을 방지하려면 어떻게합니까?
- 28. Wix가 제거시 레지스트리 항목을 제거하는 것을 방지하려면 어떻게합니까?
- 29. Visual Studio에서 "속성"폴더를 만드는 것을 방지하려면 어떻게합니까?
- 30. 이미지 처리 응용 프로그램이 사용자가 연 파일을 식별하는 방법은 무엇입니까?
나는 그것을 얻지 않는다 지불 무엇을 얻을, 헤이 계획과 약간의 작업이 필요하지만? – Treb
아, 이제 알겠습니다 : 출력 파일을 삭제하는 것은 모범 사례가 아닌 남용의 예가 될 것입니다 ... 좀 더 이해가됩니다 ;-) – Treb
앱에 대해 더 자세히 설명해 주시면 도움이됩니다. - 데이터베이스와 대화합니까? 인터넷/웹 서비스에 연결 하시겠습니까? 창문이야? .그물? – Anthony