code

앱을 더욱 전문적으로 만드는 특징 / 기능?

codestyles 2020. 11. 22. 19:48
반응형

앱을 더욱 전문적으로 만드는 특징 / 기능? 취미 말 코딩


어떤 방식 으로든 " 더 전문적 " 이라고 생각하기 때문에 PHP 웹 애플리케이션에서 어떤 기능 을 구현합니까 (어떻게) ? 아니면 개인적으로 멍청한 사람과 코드를 좋아하는 사람, 특히 중요 할만한 작은 일이 있습니까? 어떤 unsavoured 코드 또는 사소한 기능 당신이 얻을에 과도한 시간을 소비 할 권리 ?

.

Q & A 일러스트레이션을위한 목마 코딩 예시 :

데이터베이스에없는 구성 데이터 : 애플리케이션 데이터! = 구성 데이터, 이는 또한 필요성과 효율성의 문제입니다.

URL 수정 : 기술적으로 필요하지 않더라도 후행 슬래시를 추가하여 모든 웹 주소를 정규화합니다.

사람이 읽을 수있는 쿠키 : 데이터 프라이버시 를 위해 불투명 한 세션 / 데이터베이스 핸들 (인증 사용이 아닌 사용자 옵션)을 피하려고합니다.

콘텐츠 협상 : 예를 들어 RSS와 Atom 형식 사이의 간단한 변형에 적합합니다. 하지만 자주 사용되지 않는 것 같습니다.

UI에 데이터베이스 ID 없음 : 데이터베이스 내부 대리 키가 URL로 유출되지 않도록합니다. 그리고 ORM을 사용하면 db-internal 키가 비즈니스 로직에 유출되지 않아도됩니다.

.

힌트 (규칙이 아님)

  • 그렇다면 웹 애플리케이션이 평균 이상이라고 생각하는 기능은 무엇입니까?
  • 흔하지 않은 이유는 무엇입니까?
  • 사용자에게 도움이되지만 간과하기 쉽습니까?
  • 보다 전문적이고 안전한 코딩 제안이 주제에 매우 많이 있습니다. 그들은 항상 그렇습니다.
  • 그러나이 Q & A 의 의도 된 범위 는 실제로 드물고 고유 한 기능 이며 비표준 및 논란의 여지가있는 기능 일 수 있습니다. 매혹적인 것에 대한 큰 보너스.
  • 또한 PHP에서 구현되는 코딩 환경 설정과 nitpick에 관한 것입니다.
  • 너무 크거나 너무 높은 수준이라고 생각하지 마십시오. 작은 기능도 중요합니다.
  • 가능한 경우 코드를 표시합니다.
  • 그러나 구문과 코딩 스타일 / 패러다임은 대부분 주제에서 벗어납니다.
  • 그리고 유용성이나 코드 품질에 대해 논쟁하지 말자. 순전히 기능 염 및 코드 설문 조사입니다.

첫 번째 featuritis 연구 현상금 라운드 : 많은 좋은 아이디어 중 하나를 결정하기가 어려웠습니다. 사실, 나는 그것을 5 개의 즐겨 찾기로 좁힐 수 있었고 결정은 rand(). 그리고 주제는 두 번째 현상금 라운드를 보증하기에 충분히 흥미 롭습니다. 휴식 후. 그리고 다른 사람이 범위를 다듬기 위해 인수 할 수도 있습니다.


문서 .

최신 문서를 사용하거나 사용하지 않고 찾을 수있는 오픈 소스 프로젝트를 상상 해보고 이것이 당신이 생각하는 전문성에 미치는 영향을 느껴보십시오.


특히 사용자의 개인 데이터에 대한 보안에주의하십시오 .

bcrypt 와 같은 강력한 해시를 사용하여 암호를 저장합니다 ( crypt문서 참조 ).

// generating hash
// read up how $costParameter and $salt look like in the crypt() docs
$hash = crypt($password, '$2a$' . $costParameter . '$' . $salt . '$');

// checking if password is correct
if (crypt($whatTheUserEntered, $hash) == $hash) {
    // correct password
}

$salt정적 값이 아니어야합니다. 사용자마다 달라야합니다.


전문적인 외관을 위해서는 깨끗하고 미적인 그래픽 디자인매우 중요 합니다. 요즘에는 표지가 팔리기 때문입니다. 슬프지만 사실이야. 아름다운 코드와보기 흉한 웹 애플리케이션은 많은 관심을 끌지 못할 것입니다.


건강 검진

언제든지 볼 수있는 (관리자 / 사이트 소유자가) 웹 애플리케이션 또는 웹 사이트의 기본 "상태"를 결정하는 일련의 사전 구성된 테스트로 다음과 같은 내용을 보여줍니다.

  • 데이터베이스 서버에 연결할 수 있습니까?
  • 필요한 파일과 디렉토리를 쓸 수 있습니까?
  • 모든 데이터 구조가 정상이고 완전합니까?
  • 모든 페이지 / 대화 상자 / 쿼리가 올바르게 표시됩니까?
  • 사용 가능한 디스크 공간이 충분합니까?
  • 기타 등등.

간단한 상태 페이지에는 녹색, 주황색 또는 빨간색 배경으로 시스템의 현재 "상태"가 표시됩니다.

이것은 추상 코드 무결성이 아닌 "실제"환경의 상태를 처리한다는 점에서 단위 테스트와 다릅니다.

상태 확인을 통해 애플리케이션을 다른 서버로 쉽게 마이그레이션 할 수도 있습니다.

지속적인 모니터링이 필요한 여러 프로젝트에서이를 구현했습니다. 올해 언젠가 모든 종류의 웹 응용 프로그램과 웹 사이트에서 사용할 수있는 확장 가능한 작은 오픈 소스 응용 프로그램으로 만들 계획입니다. 참여 및 입력을 환영 합니다. 자세한 내용 관련 SO 질문 을 참조하십시오.


소스 제어. 특히 Git (특별히 GitHub는 아니지만)

좋아요, 드물지 않습니다.
그러나 코드를 아웃소싱하고 모든 역사와 우여곡절이있는 깔끔한 저장소를 되 찾을 때, PHP 파일로 가득 찬 폴더보다 훨씬 더 인상적입니다.
그리고 그것은 보이지 않는 프로젝트에 얼마나 많은 추가 작업이 투입되었는지 보여줍니다.

나는 GitFlow를 사용 하는데 , 사용 하는 동안 조금 더 오래 걸리지 만 완성 된 프로젝트에서 훨씬 더 인상적이라는 점에서 그 자체를 보충합니다. 클라이언트가 github 그래프 (또는 동등한 그래프)를 볼 수 있는지 확인하십시오. 모든 분기가 깔끔하고 인상적으로 보입니다. (실제로 유용한 것 외에도!)

관련 :
이슈 추적 시스템.
코드가 완료되기 전 (클라이언트가 검토하는 동안)과 이후에 새로운 작업을 추가 할 수 있습니다.
그것은 작업을 구분하고 더 많은 작업을 얻는 방법 일뿐만 아니라 클라이언트가 프로젝트가 여전히 내 마음 속에 있다고 느끼게합니다. 나는 이사를했지만.
저는 Collabtive를 사용 합니다 . 이것은 이러한 시스템이 진행될 때 절대적으로 끔찍하지만 제가 시도한 다른 것보다 더 인상적입니다. 인상적으로 보이는 것은 전문적인 것으로 간주됩니다.


암호 강도 / 일치

비밀번호를 등록하거나 변경할 때 사용자에게 비밀번호의 약점을 대화식으로 알립니다. 또한 입력 할 때 확인이 일치하는 경우에도 알립니다.

실시간 양식 유효성 검사

암호와 마찬가지로 양식 항목의 실시간 유효성 검사는 사용자가 실수를했는지 또는 건너 뛴 필수 필드를 생략하기 전에 전체 양식을 완료하도록 허용하는 것보다 훨씬 덜 짜증납니다.

친숙한 예외 / 오류 처리를 사용한 방어 프로그래밍

알 수없는 오류 메시지를 사용하지 말고 일반적으로 유용한 오류 메시지를 찾을 수있는 최상의 사례를 참조하십시오. 가장 좋은 경우에는 일반적으로 좋은 목소리 톤을 유지하는 작업을 수행하는 재능있는 카피라이터가 필요합니다.

이것은 견고한 예외 처리 및 좋은 방어 프로그래밍과 함께 진행됩니다.

방어적인 디자인 은이 주제에 대한 꽤 괜찮은 책입니다.


기능을 유지하기 쉬운 코드를 작성하십시오. 쓰기를 시작하기 전에 객체의 인터페이스에 대해 몇 번 생각하십시오. 지금 당장 필요하지 않더라도 많은 이벤트 트리거를 추가 합니다 . 기능에 유용 할 수 있습니다.

마치 외부 라이브러리 인 것처럼 코드를 작성합니다. 상업용 폐쇄 형 애플리케이션을 다루더라도 오픈 소스 프로젝트로 취급하십시오. 변경하지 않고 기존 코드의 동작을 변경하려는 다른 사용자를 생각해보십시오. 타입 힌팅을 사용하는 경우 클래스보다는 인터페이스를 확인해야합니다.

public function add(Storable $resource);    # Good
public function add(SessionStore $session); # Bad

전역 네임 스페이스 및 "전역 기능"을 사용하지 마십시오. 전역 상수를 정의하거나를 사용하여 __autoload()다른 오토로더를 등록하는 대신 사용 spl_autoload_register()하는 것은 좋지 않습니다.

타사 코드를 사용하십시오. 거기에는 많은 도서관이 있습니다. 대부분의 경우 자체 ORM 또는 메일러를 개발하는 것은 의미가 없습니다. 애플리케이션 개발에 필요한 시간을 단축합니다.-> 비용을 절감합니다.

API 문서를 만듭니다. 설명이 필요하지 않다고 생각합니다.

코드를 깔끔하게 만들고 코딩 규칙을 유지하십시오.

쓸모없는 페이지를 만들지 마십시오. 큰 404 NOT FOUND 정보 만있는 404 Not Found 페이지보다 더 성가신 것은 없습니다. 각 리소스에 대해 찾을없는 여러 페이지를 제공해야 합니다. 그래서 제가 방문 했는데 죄송 합니다만/video/123/how-to-swim 그런 리소스가 없으면 해당 동영상이 존재하지 않거나 삭제 된 것입니다. 다음과 같은 것을 추가하십시오 : 최근 비디오 , 아마도 당신이 찾고있는 것 : "how to dace", "swimming : abc" (제목 양식 URL (how-to-swim)과 유사한 제목의 비디오) 등.

사용자가 웹 사이트를 맞춤 설정할 수 있습니다. 최근 동영상, 최근 사진, 최근 활성 스레드, 뉴스, 홍보 갤러리 등 여러 "상자"가있는 홈페이지가 있다고 가정 해보십시오. 사용자가 이러한 항목 중 일부를 숨기고 순서를 변경할 수 있도록 허용하십시오. 누군가는 사진에 더 관심이있을 수 있습니다. 뉴스와 스레드가 아닌 비디오를 페이지 상단에 올리고 싶을 수도 있고, 다른 사람은 선호도가 다르고 순서도 다를 수도 있습니다. 각 상자에 "디스플레이 : 5, 10, 20 개의 최근 동영상"과 같은 환경 설정을 추가합니다.


사용자 경험을 향상시키고 앱을 더욱 전문적으로 만들지 만 백엔드를 처리하는 몇 가지 (PHP 지향이 적은) 포인트를 추가하려면 다음을 수행하십시오.

좋은 압축 / 최소화
종종 웹 앱은로드시와 사용 과정에서 많은 수의 요청을 보냅니다. 축소는 CSS 스프라이트 및 GZipping 콘텐츠 사용과 같이 초기로드 가중치를 줄이는 데 도움이 될 수 있습니다. 애플리케이션을 간소화하고 최대한 빠르게 만드는 데 도움이되는 좋은 방법은 Firefox의 Firebug 확장을위한 Yahoo의 YSlow 플러그인입니다.

Firebug : http://getfirebug.com/

YSlow : http://developer.yahoo.com/yslow/

또한-몇 가지 모범 사례 : http://developer.yahoo.com/performance/rules.html

YSlow는 애플리케이션을 깔끔하고 깔끔하고 빠르고 깔끔하게 만드는 방법을 식별하는 데 도움이됩니다. 또한 파일 압축의 많은 부분을 처리하기 위해 PHP Minify를 권장합니다.

PHP Minify : http://code.google.com/p/minify/

또한 Firebug를 사용하는 또 다른 이유는 웹 앱을 개발할 때 제공하는 엄청난 이점입니다. 특히 생성 된 데이터 흐름을 추적 할 수있는 작업 중에 앱이 얼마나 안전한지 정확히 식별하는 것이 중요합니다.

난독 화
--- 아래에 더 자세한 답변으로 분할

Apache 재 작성의 좋은 사용
브라우징 경험을 향상시키고 논리적으로 정리 된 콘텐츠의 인상을주기 위해 깨끗한 URL을 제공하는 기본적인 이점 외에도 좋은 .htaccess 파일은 사이트에 보안 계층을 추가하고 콘텐츠 서버 측을 압축하고 추가 할 수 있습니다. 추가 식별자 (예를 들어 E- 태그, 장점이 논쟁의 여지가 있음). 모든 웹 앱에는 잘 작성된 .htaccess도 있어야합니다.

호환성 / 검증
저는 항상 모든 개발자가 모든 출력 코드가 유효하고, 주석 처리되고, 논리적이고, 깨끗한 지 확인하기 위해 가장 광범위한 (합리적인) 길이로 이동하도록 강력히 촉구합니다. W3C는 HTML뿐만 아니라 Web Apps의 작동 방식을 명확하게 지정하는 환상적인 작업을 수행합니다. 그들의 지침에 따라 작성하는 모든 내용의 호환성을 높이고 모든 사람이 원하는 방식으로 작동하는지 확인하십시오.

몇 가지 훌륭한 도구 :

HTML 유효성 검사기 : http://validator.w3.org/

기타 검증 : http://validator.w3.org/unicorn/

알아야 할 몇 가지 사양 :

W3C 웹 애플리케이션 (WebApps) 워킹 그룹 : http://www.w3.org/2008/webapps/

W3C 접근성 지침 : http://www.w3.org/WAI/guid-tech.html

W3C WAI-ARIA 이니셔티브 : http://www.w3.org/WAI/intro/aria.php

자바 스크립트 측면에서 JS lint는 JS의 버그 (확인할 때 성능에 영향을 미치지 않을 수 있음)가 제거되었는지 확인하는 훌륭한 도구입니다.

JSLint : http://www.jslint.com/

그리고 대리로 개발을 지원하기 위해 미화 JS는 개발, 사전 축소를 위해 코드를 더 잘 구성하는 데 도움이 될 수 있습니다. http://jsbeautifier.org/

물론 아름다운 PHP ... http://beta.phpformatter.com/

마지막으로-약간 덜 흑백
인간화

웹 기반 애플리케이션을 생산할 때 얻을 수있는 가장 큰 이점 중 하나는 사용자간에 (협업 작업을 장려하기 위해)뿐만 아니라 사용자와 앱 자체, 그리고 지속적인 개발 및 유지 관리를 담당하는 사람들 간에도 제공 할 수있는 연결입니다. .

37 Signals와 같은 프로젝트를 생각하는 경우-매력적인 요소 중 하나는 프로젝트 (코드) 자체가 인간화되었으며 캐릭터가 있다는 느낌을 사용자에게 전달하여 사용자를 앱에 끌어 들이고 연관시키는 데 도움이된다는 것입니다. 사용의 즐거움과 타인과의 커뮤니케이션. 나는 앱이 '살아있다'는 의미는 아니지만, 더 '접근하기 쉽다'고 느끼고 사용자가 그것으로 '식별'할 수 있다는 것을 의미합니다.

그러나 이것은 인간화 코인의 한면에 불과하며, 사용자가 앱 / 코드 / 프레임 워크 / 경험에 대해 '공감'하도록 거의 유도하여 사용하도록 유도합니다. 다른 측면은 앱과 그 뒤에있는 앱 사이의 경계를 허무는 것입니다.

우리 모두는 우리가 사용하는 사람, 사람 등을 알고 싶어합니다. 우리는 그들로부터 많은 정보를 전달하고 종종 비논리적으로 앱 자체에 적용하기 때문에 실제로 우리의 '좋아요'(예 : Steve Jobs, Apple 구입 등)에 적용합니다. . 비록 변덕스러운 예이지만). 어려운 상황에서 실제 사람과 연락 할 수있는 경로를 갖는 것은 간단한 단계입니다. 개발자 블로그, 뉴스 스트림 등을 갖는 것입니다. 앱 주위에 인간화 된 메타 버스를 구축하면 신뢰도와 그것이 아마도 부분의 합.

물론 인간화는 여기 저기에있을 수 없으며 구축하기가 매우 어렵습니다 (같은 방식으로 다른 사람들이 서로 다른 친구를 가지고 있음).하지만 개발자가 더 임상적이고 수술적인 앱의 가장자리를 깎아내어 더 편안하게 만들 수있는 방법은 무엇이든 가능합니다. 그리고 일상적인 사용자에게 접근하기 쉽고 재미있는 것이 내 책의 승자입니다.


강제 등록 없음
이것은 일상적인 웹 애플리케이션에서 흔히 발생하는 문제입니다. 강제 계정 등록은 사용자 친화적이지 않습니다. 오늘날 스팸과 오용을 방지하는 것이 필요합니다. 그러나 그것은 채택을 방해합니다.

나는 모두가 Stackoverflow에 대해 들어 본 것 같습니다. 그들은 등록을 강요하지 않습니다. 계정없이 참여할 수 있습니다. 등록 강요 하는 대신 체계적으로 장려 합니다. 그러나 요점은 적어도 커밋하기 전에 점차적으로 익숙해 질 수있는 옵션이 있다는 것입니다.

단순한 개념입니다. 그러나 마찬가지로 구현하기가 어렵습니다. 임시 및 선택적 사용자 계정을 거의 다룰 수 없으며 기본 애플리케이션 논리 및 데이터베이스 구조를 준비해야합니다. 구현 노력에 관계없이 이것이 중요하고 과소 평가 된 기능이라고 생각합니다.


종종 간과되는 하나 : Printable CSS . 작성하기는 어렵지만 응용 프로그램에서 일부 데이터를 출력하려는 ​​사용자에게는 많은 차이가 있습니다.

<link href="print.css" rel="stylesheet" type="text/css" media="print"> 

연속 포인트

예 : 양식을 제출하면 리디렉션되고 이제 랜딩 페이지에 알림이 포함되어야합니다. 대부분의 사이트는 단순히 해당 알림을 세션에 저장합니다. 즉, 다음에 액세스 할 페이지가 해당 메시지를 표시합니다. 대부분의 경우 문제는 없지만 내 마음에는 정말 지저분합니다. 세션은 다음 요청 데이터가 아닌 세션 데이터 용이라고 생각합니다 .

내 솔루션 : 배열을 만들고 데이터 (알림 등)를 작성하고 sessionid + 고유 식별자를 사용하여 memcache에 저장하고 리디렉션에서 param __continuation = {that unique identifier}를 추가합니다. 그런 다음 다음 페이지에서 해당 데이터를 다시로드하고 처리합니다.

이것은 짧은 메시지보다 더 많은 데이터를 원할 때 더 편리합니다.

질문이 있으십니까?


일관된 프로그래밍 스타일, 변수 이름 지정, 브레이싱 등. 코딩 표준 준수 (모든 코딩 표준) 다른 사람이 작성한 파일이 동일하게 보이도록하여 코드를 유지 관리 할 때 누가 작성했는지 알 필요가 없도록합니다.


예를 들어 : URL "fixing"
http-URL의 경우 모든 브라우저와 마찬가지로 경로 조각을 필수로 취급합니다. 따라서 사용자 입력과 가져온 데이터를 "수정"하고 이러한 값을 표시하거나 저장하기 전에 항상 http://example.org에 후행 슬래시를 추가 합니다. 아마도 "우버 전문성"은 아니지만 URL을 정규화하면 나중에 쉽게 처리 할 수 ​​있습니다. 그리고 잘 모르겠습니다. "더 나은"것 같습니다.

 $url = preg_replace("/^(http:..[-\w.\d]+)$/", "$1/", $url);

그래서 나는 항상 http://example.org/가치를 가질 것입니다. 이것은 HTML을 더 이상 표준을 준수하게 만들지는 않지만 애완 동물 중 하나 일뿐 입니다.


UI에 데이터베이스 ID 없음
대부분의 데이터베이스 개체는 일부 대리 키와 함께 열거됩니다. 제 생각에 스타일리시하지 않은 것 (때로는 보안상의 함정일 수 있음)이 URL에서와 같이 UI로 유출되고 있습니다. 의 어떤 위치를 user.php?id=37310843변경하는 것은 큰 문제가 아닙니다 user.php?name=title. 그리고 데이터베이스가 ID 나 이름을 조회하는 것은 거의 차이가 없습니다. 그래서 그것은 SEO 어리 석음이 아니라 가문비 나무 외관에 관한 것입니다.

  • 적절한 ORM을 사용하면 데이터베이스 내부 ID가 애플리케이션 로직에 유출 될 필요조차 없었습니다.
  • Exhibit Wikipedia : 페이지 제목 대신 대리 키를 사용했다고 상상해보십시오. (CoWiki 참조)
  • 외부 링크가 항상 동일한 콘텐츠를 가리 키도록하려면 대리 키를 피해야합니다. 정확한 할당을하는 것이 중요하다면 어쨌든 GUID를 사용해야합니다.

2.0 웹 앱이 가질 것으로 예상되는 중요한 것 중 하나는 다음과 같습니다.

  1. 검색 -전체 텍스트 검색, 키워드 검색, 자동 제안 또는 (가장 최근의) 실시간 검색 여부에 관계없이. 이 기능이 없으면 어떤 사이트 (특히 검색 엔진에 폐쇄 된 사이트)를 방문 할 때 숨이 멎을 것 같습니다. 모든 최신 2.0 사이트 PHP에 대해 확실한 것이 있어야합니다.
  2. MVC 프레임 워크- 이것은 웹 개발과 관련이 있기 때문에 (PHP에 묶여 있지 않음) Model-View-Controller 프레임 워크는 필수입니다. 과도한 코드 기반과 더 빠른 반복 주기로 인해 적절한 구조화는 미래의 번거 로움과 추적 할 수없는 버그를 방지하는 데 필수적입니다.
  3. AJAX- 이것에 대해 말할 필요가 있습니다. :) 우리 대부분이 웹 사이트를 탐색하는 방식이 바뀌 었습니다. AJAX를 사용하면 웹 사이트가 멋진 기능입니다.
  4. 디버그 정보- 앱이 충돌하는 경우입니다. 무엇이 잘못되었는지 어떻게 알 수 있습니까? 로그를 유지합니까? 로그에서 문제의 원인을 추적 할 수 있습니까 (발생 후 몇 시간)? 로그를 얼마나 장황하게 만들어야합니까?
  5. 최소화 된 자바 스크립트 및 CSS- 로딩 시간을 줄이고 사이트를 더욱 깔끔하게 만들어 사용자가 사이트를 탐색하는 동안 더 편안하게 느끼도록합니다.
  6. 캐싱- 사용자가인지하는 응답 시간을 엄청나게 증가시켜 사이트를보다 "전문적"으로 만듭니다.

통합 응용 프로그램

온라인 상거래 시스템을 실행 중이고 카드 결제 공급 업체가 오프라인 상태 인 경우 고객이 여전히 제품을 탐색하고 다른 결제 방법을 사용하여 결제 할 수 있어야하지 않습니까?

응용 프로그램은 전체 사이트를 "유지 관리 모드"로 전환하지 않고 응용 프로그램의 페이지 또는 일부를 정상적으로 사용할 수 없게 만드는 "스위치"를 전환 할 수있는 방식으로 구축되어야합니다. stil은 다른 사용자가 사용할 수 있습니다.

통합 응용 프로그램은 이름이 좋지 않을 수 있지만 거기에 더 나은 것이 있다고 확신하지만 사용 가능한 응용 프로그램을 개발할 때 많은 사람들이 잊어 버리는 접근 방식 중 하나입니다.

스마트 무차별 대입 보호

많은 고객 정보를 보유하고있는 애플리케이션의 관리 부분이 있다고 가정 해 보겠습니다. 누구도 손에 넣지 않기를 바라는 데이터입니다. 암호를 해시하는 데 좋은 솔트와 좋은 알고리즘이 있더라도 사악한 사용자가 로그인 양식에 대해 DOS / 레인보우 테이블 (무차별 공격?) 공격을 수행 할 수 있습니다.

첫 번째 옵션은 자동화 된 소프트웨어를 사용하여 이러한 공격을 수행하고 암호를 정확하게 추측하여 수동으로 수행함으로써 보조를받는 것입니다. Google을 사용하여 사용할 수있는 정보의 양을 고려하면 사용자의 비밀번호를 추측 할 수있는 충분한 정보를 찾는 것은 정말 쉽습니다. 또한 스웨덴과 같은 국가에 거주하는 경우 당국에 전화 한 번으로 전화를 한 사람에 대해 알 수없는 정보가 많지 않습니다. 사회 보장 번호, 파트너 이름, 결혼 상태, 자녀 이름, 애완 동물 및 훨씬 더 많은 정보가 모두 일반 사용자 의 암호에 대한 매우 적합한 추측으로 함께 제공됩니다 .

우리가했을 경우, 자신의 암호를 선택하는 방법 보통 사람들의 모습을 , 보안은 해야 정말 쉽게 타협. 물론 사용자 암호 길이, 특수 문자 등에 대한 제한을 설정할 수는 있지만 상황에 영향을 미치지는 않습니다. 무차별 대입 공격은 여전히 ​​가능합니다.

사용자가 로그인을 시도하고 알 수없는 IP에서 두 번째 시도에 실패하면 자동 로그인을 방지하기 위해 recaptcha가 나타납니다. 다른 (n) 번의 시도가 실패하면 계정이 완전히 잠기고 로그인을 수행하기 전에 다시 활성화해야합니다.

성능을 먹는에서 자동으로 공격을 방지하기 위해, 좋은 아이디어는 아마도 완전히 만든 IP 차단하는 것 (N) 는 수동으로 다시 허용 한 때까지 로그인 페이지에 액세스, 설정된 시간 범위 내에서 실패한 로그인 시도합니다.


WRT 구성이 데이터베이스에 없습니다 . 예를 들어 5 분 만료와 함께 Memcache를 사용합니다. 보다 정교한 옵션은 구성이 변경 될 때마다 "구성 다시로드"페이지를 터치하는 것입니다. 트릭은 팜의 모든 앱 서버 인스턴스에서 페이지를 터치하도록하는 것입니다 (이것이 제가 Memcache를 선호하는 이유입니다).


PHP의 delve 함수를 사용하면 다음을 수행 할 수 있습니다.

$a = delve($array,'a.b.c.d','default'); // $a->b['c']->a
$b = delve($object,'a.b.c.d','default'); // $a->b['c']->a

이것이 없으면 고통스러운 issets 및 empties를 수행하고 모든 피의 시간 동안 데이터 유형을 확인해야합니다. 이것은 제가 가장 좋아하는 기능입니다.

더 전문적인 코드를 만드는 것과 관련하여 단위 테스트, 문서 버전 제어 및 먼저 수행하십시오 (그런 다음 실패하면 스택 오버플로로 되돌림).

/**
 * Delve into an array or object to return the value of a set of keys
 * @version 1, December 24, 2009
 * @param mixed $holder
 * @param mixed $keys
 * @param mixed $default
 * @return mixed
 * @package balphp
 * @author Benjamin "balupton" Lupton <contact@balupton.com> - {@link http://www.balupton.com/}
 * @copyright Copyright (c) 2009-2010, Benjamin Arthur Lupton - {@link http://www.balupton.com/}
 * @license http://www.gnu.org/licenses/agpl.html GNU Affero General Public License
 */
function delve ( $holder, $keys, $default = null) {
    # Prepare
    $result = null;
    $end = false;

    # Prepare Keys
    ensure_keys($keys, $holder);

    # Handle
    $key = array_shift($keys);
    if ( $key === null ) {
        # Reched the end of our key array, so holder must be what we want
        $result = $holder;
        $end = true;
    } else {
        switch ( gettype($holder) ) {
            case 'array':
                if ( array_key_exists($key, $holder) ) {
                    # We exist, so recurse
                    $result = delve($holder[$key], $keys, $default);
                } else {
                    $end = true;
                }
                break;

            case 'object':
                if (
                    /* Already accessible via normal object means */
                    isset($holder->$key)
                    /* Is Doctrine Record */
                    ||  (   ($holder instanceOf Doctrine_Record)
                            &&  ($holder->hasAccessor($key)
                                    ||  $holder->getTable()->hasField($key)
                                    ||  ($holder->hasRelation($key) && (!empty($holder->$key) || $holder->refreshRelated($key) /* < returns null, hence the OR and extra check > */ || isset($holder->$key)) ) // && $holder->$key->exists())
                                )
                        )
                    /* Is normal object */
                    ||  (   !($holder instanceOf Doctrine_Record)
                            &&  method_exists($holder, 'get')
                            &&  $holder->get($key) !== null
                        )
                ) {
                    # We exist, so recurse
                    $result = delve($holder->$key, $keys, $default);
                } else {
                    $end = true;
                }
                break;

            default:
                $end = true;
                break;
        }
    }

    # Check Default
    if ( $end && $result === null ) {
        $result = $default;
    }

    # Done
    return $result;
}

전체 파일 (및 라이브러리) : http://github.com/balupton/balphp/blob/master/lib/core/functions/_arrays.funcs.php


자동화 된 단위 테스트

중요한 것은 상태 점검 페이지가 중요한 방식입니다. 내 코드가 800 줄을 넘으면 100 줄에서 무엇을했는지 기억이 안 나고 깨닫지 못한 채 코드를 깨뜨릴 것입니다.


국제화 / 로케일 지원

다양한 언어로 애플리케이션 번역을 제공하고 사용자의 로케일 설정에 따라 적절한 언어를 제공합니다.

모바일 버전

사용자 에이전트 문자열을 감지하고 앱의 모바일 / 터치 친화적 버전을 제공합니다. xhtml 모바일 프로필을 사용하면 매우 쉽습니다 .

여러 백엔드를 지원하는 ORM 사용

개발자와 사용자 모두 구성 파일을 편집하여 데이터베이스 백엔드를 교체 할 수 있다는 점이 좋습니다. 이렇게하면 개발 / 단일 사용자 용 SQLite와 프로덕션 용 PostgreSQL 또는 MySQL과 같은 것을 실행할 수 있습니다.

(눈에 거슬리지 않음) Javascript가 비활성화 된 경우 알림

JS를 끄거나 비활성화 한 상태에서 Stack Overflow에 가본 적이 있습니까? 때때로 나는 noscript가 켜져 있다는 것을 잊고 그래서 도움이됩니다. 그런 다음 다시 켤지 여부를 결정할 수 있습니다. 그러나 적어도 나는 앱이 절름발이라고 생각하기보다는 기능이 빠졌다는 것을 알고 있습니다.

Firebug / Javascript 로깅

많은 로깅을 제공하면 ajax 문제를 디버그하는 데 도움이됩니다. javascript에서 console.log (message)를 수행하면 메시지가 firebug에 기록됩니다. 이를 켜거나 끄는 애플리케이션 구성 파일에 프로덕션 / 개발 스위치가 있어야합니다 (PHP가 프로덕션 모드에서 로그 메시지를 생성하지 않도록합니다).


전체 사이트 SSL / TLS 암호화

Firesheep 의 최근 릴리스에서 알 수 있듯이 개방형 Wi-Fi 환경 (예 : 많은 도서관, 호텔 및 기타 장소에서 제공) 및 아직 전환되지 않은 이더넷 세그먼트에서 세션 쿠키를 훔치는 것은 사소한 일입니다. (이론적으로 는 스위치도 켜짐 )

Firesheep은 이제 평범한 Joe에게도 두 번의 클릭으로 작동하므로 전체 사이트 암호화는 더 이상 사치품으로 취급 할 수 없습니다. (설정과 함께 보안 실수로 보안되지 않은 요청은로 누출되지 않습니다 호환 브라우저를 보장하기 위해 세션 쿠키에 플래그를) 어느 확장도 문제를 멀리 갈 수 있습니다.

Adam Langly의 블로그에 따르면, Google은 SSL / TLS 가 사람들이 추측하는 것만 큼 나쁘지 않다는 것을 발견 했으며, 약간의 조정 (Chrome에서 구축 중임 )을 통해 추가 연결을 설정하는 대기 시간 구성 요소까지도 왕복을 효과적으로 제거 할 수 있습니다.

StartCom이 무료 SSL 인증서를 제공하고 루트 인증서가 이미 모든 주요 브라우저에 존재하기 때문에 인증서 비용조차도 많은 사람들이 생각하는 것만 큼 큰 문제가 아닙니다 .


레지스트리 시스템.

객체 및 범위 문제를 저장하는 것과 관련하여 이전에 여러 번 이야기했으며이를 극복하기 위해 내가 아는 가장 좋은 방법은 응용 프로그램 주변에서 객체를 전송하는 데 도움이 될 수있는 getter 및 setter와 함께 Static / Abstract 클래스를 사용하는 것입니다. 사용하기 위해 특별히 개체를 가져올 수 있도록 클래스를 수정합니다.

이 클래스는 2 개의 메서드와 1 개의 배열이있는 추상 정적 클래스처럼 간단 할 수 있습니다. 이것들은 오븐 내에서 다른 영향을주지 않고 큰 범위 문제를 극복하기위한 기본 요소입니다.

다음은 내가 말하는 것에 대한 작은 예입니다.

abstract class Registry
{
    private static $objects = array();

    public static function set($name,$object)
    {
        self::$objects[$name] = $object;
    }

    public static function get($name)
    {
        return self::$objects[$name];
    }
}

해당 클래스의 단순성을 살펴보면 두려워 할 것이 없습니다. 현재 프레임 워크 / 애플리케이션을 수정하여이 방법을 채택 할 수는 없지만 작동 방식이 확실하지 않은 경우 몇 가지 예를 들어 드리겠습니다.

Firsty은 우리가 말할 수 index.php즉 포함 startup.php하고, 내 startup.php당신이 당신의 라이브러리 및 핵심 프레임 워크 코드를 포함하지만 시작하여 적재 다음에

  • 데이터 베이스
  • 세션
  • FileWriter
  • 입력
  • 산출

이제 객체를 객체 FileWriter내에서 로깅을위한 도구로 사용하려면 Database일반적으로 변수를 호출 $FileWriter하고 Database객체 에서 global 키워드를 사용 합니다.

그러나 다음을 수행하십시오.

Registry::set('Database', new Database())
Registry::set('Session', new Session())
Registry::set('FileWriter', new FileWriter())
Registry::set('Input', new Input())
Registry::set('Output', new Output())

Registry객체 내에 모든 것을 저장 하므로 데이터베이스 객체 / 클래스를 살펴 보겠습니다.

class Database
{
    //..

    public function connect()
    {
        if(!$this->connected())
        {
            try
            {
                $this->connect();
            }catch(Exception $e)
            {
                Registry::get('FileWriter')->Write('db_logs',array($this,$e),'unable to connect to database');
            }
        }
    }

    //..
}

이제 레지스트리가 클래스의 범위 내에서 사용 가능하고 깨끗하고 안전하며 추가 변수를 사용하지 않거나 더 많은 코드를 사용하지 않고 globalization간단하고 안전합니다.

읽기를 즐겼기를 바랍니다.


나는 이것이 끔찍한 코드이며 반대 할 가치가 있다는 것을 알고 있습니다. Content Negotiation 이 실제로 달성하기 쉽다는 예를 들었습니다 .

function q_order($src) {
    $src = str_replace(",", ";q=0.99,", "$src;last;q=0.975");   // inject placeholder values
    foreach (explode(",", $src) as $prt) {   // split entries
        $q[trim(substr($prt, 0, strpos($prt, ";")))]   // append TOKEN until ";" 
        = floatval(substr($prt, strpos($prt, "q=") + 2));  // and first float after "q="
    }  
   arsort($q);
   return($q);
}   

이를 통해 HTTP_ACCEPT 헤더를 빠르게 정렬 할 수 있으며, 이는 RSS와 Atom 피드 형식을 자동으로 교체하는 데 유용합니다. 또는 기본 언어를 설정하기 위해. (어쨌든 언어 플래그 / 링크가 필요한 경우가 많지만 영어를 기본값으로 설정하는 것보다 더 나은 기본값입니다.)

$lang = q_order($_SERVER["HTTP_ACCEPT_LANGUAGE"]);
if ($lang["de"] >= $lang["en"]) { ...

데이터베이스에없는 구성 데이터 : 응용 프로그램 데이터가 데이터베이스에 속합니다. 그러나 구성 설정은 그렇지 않습니다. 왜?

  • 모든 PHP 요청에서 런타임 옵션에 대해 데이터베이스를 쿼리하는 것은 효율적이지 않습니다.
  • 설정은 매일 변경되지 않으며 대부분의 사용 사례에는 정적 저장소로 충분합니다.
  • 데이터베이스 구성 파일 사이의 불일치는 데이터베이스에 나머지 런타임 옵션이 있다는 것은 어리석은 것처럼 보입니다.
  • IMO는 종종 게으름으로 인해 수행됩니다. 안전하게 설정하고 파일 (ini) 저장소를 수정하는 것은 다른 SQL 테이블보다 더 관련이 있기 때문입니다.
  • 예외적으로 사용자 설정 및 도메인 별 구성은 데이터베이스 저장소 없이는 관리 할 수 ​​없습니다.

실제로는 거의 필요하지 않지만 실제로 사용자가 런타임 구성을 편집 할 수 있기를 원합니다 (1 년에 한 번). 그래서 사실상 나는 데이터베이스에 필요한 것보다 구성 파일 수정 기능 에 더 많은 시간을 할애 합니다. 장점 : SQL 구성 테이블보다 백업 및 버전 관리가 더 쉽습니다.

단점 : 액세스 / 아카이빙 / 버전 관리가 문제가되지 않는 경우 SQL은 APC 또는 memcached (효율적인 액세스를 위해)와 결합하면 좋은 구성 저장소를 만듭니다. 캐시 파일도 가능한 솔루션입니다.


당신은 개인적으로 멍청한 사람과 코드를 좋아하는 사람, 특히 중요 할만한 작은 것들을 가지고 있습니까? 제대로 작동하기 위해 과도하게 많은 시간을 소비하고 있습니까?

어레이 키를 올바르게 참조

숫자가 아닌 배열 키 (즉, 인덱스가 아님)는 모든 상황에서 PHP가 올바르게 처리하고 대부분의 좋은 코드 편집기에서 구문을 감지 할 수 있도록 작은 따옴표로 묶어야합니다. 예 :

$array['key'];

아니

$array[key];

한 번 필요 / 포함

왜 require_once 및 include_once를 사용하는지 항상 스스로에게 물어보십시오. 대부분의 경우 이미 가져 왔거나 가져 오지 않았을 수있는 코드 복제를 방지하는 것입니다. 이것이 가능하다면 PHP를 가장 효율적이고 효과적인 방법으로 작성 했습니까?

클린 로딩 및 개선 된 속도를위한 버퍼 출력

첨가:

ob_start('ob_gzhandler'); 

스크립트의 시작과 :

ob_end_flush();

끝까지 스크립트의 출력을 압축하고 버퍼링하여 콘텐츠가 제공 될 때 더 빠르게로드되고 점진적으로 표시되지 않도록합니다.

미리 정의 된 루프

루프가 실행될 때마다 시작하기 전에 최대 값을 설정해야합니다. 함수가 참조되는 경우가 너무 많이 발생합니다 (이것은 상당히 광범위하게 다루고 있음에도 불구하고). 즉 :

for($=0;$i<count($x);$i++){
// code
}

즉, 코드가 반복 될 때마다 count 함수가 실행되므로 비효율적입니다. 다음을 수행하는 것이 훨씬 좋습니다.

$stop=count($x);
for($=0;$i<$stop);$i++){
// code
}

RegEx 대 ​​PHP 문자열 / 숫자 처리기

문자열을 처리하고 PHP에 상응하는 것이 있으면 RegEx에 대한 의존도를 줄이십시오. stripos, strncasecmp 및 strpbrk가 더 빠릅니다. strtr은 preg_replace보다 약 5 배 빠릅니다. ctype_alnum, ctype_alpha 및 ctype_digit를 사용하여 RegExp 대신 양식 유효성 검사를 수행 할 수 있습니다.

작업 공간 정리

완료되면 항상 DB 연결을 닫고 항상 변수 설정을 해제하십시오. 완벽하다면 좋은 연습입니다.

일관된 견적 사용

작은 따옴표와 큰 따옴표를 일관되게 사용하십시오. 즉, 다음을 사용하는 경우 :

echo "this is a 'string' not a number";

다음을 사용하지 마십시오.

echo 'this is a "string" not a number';

순서를 반대로해야하는 경우 동일하게 유지하고 재귀 인용 부호를 이스케이프하십시오. 또한 PHP는 큰 따옴표로 캡슐화 된 문자열로 작업하는 것이 훨씬 낫습니다. 연결하지 않고도 변수를 캡슐화 할 수 있습니다. 예 :

echo "this and $thisvariable here";
// instead of
echo 'this and '.$thisvariable.' here';

자동 영구 링크

이 기능을 사용하면 누구나 링크의 href로 설정할 수 있으며 쉽게 영구 링크 할 수 있도록 페이지의 URL을 자동으로 가져옵니다.

//Gets the URL of the current page
//set $p to yes to echo the urlturn the url or no to re
function page_url($p)
{
    $s = empty($_SERVER["HTTPS"]) ? ''
        : ($_SERVER["HTTPS"] == "on") ? "s"
        : "";
    $protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s;
    $port = ($_SERVER["SERVER_PORT"] == "80") ? ""
        : (":".$_SERVER["SERVER_PORT"]);
    switch ($p)
        {
        case 'yes':
            echo ($protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI']);
            break;
        case 'no':
            return $protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI'];
            break;
        default:
            echo('javascript:alert(\'invalid Argument in function page_url($p)\')');
        }
}
function strleft($s1, $s2)
{
    return substr($s1, 0, strpos($s1, $s2));
}

사람이 읽을 수있는 쿠키
나는 개인적으로 PHP로 변수를 저장하기가 더 쉽기 때문에 항상 SESSION에 의존하는 것이 약간 예술이 없다고 생각합니다.

세션 ID는 기술적으로 종종 쿠키이지만 사람이 읽을 수 있고 불투명 한 저장소 핸들이 아닙니다. 그래서 대신에 간단한 사용자 선호 사항 (교육 자료가 아님)이라면 읽을 수있는 쿠키 이름과 값 (예 : product_order=desc또는 fav_background=orange.

보통 나도 세션에 의지합니다. 그러나 데이터 프라이버시 ( 사용자 권한을 의미)에 관심이있는 개인 프로젝트의 경우 모든 단점을 감안했습니다.

  • 여러 쿠키에 대한 더 많은 마이크로 관리 오버 헤드.
  • 모든 쿠키가 사용자 입력이되므로 각 쿠키에 대한 유효성 검사를 개별적으로 수행합니다.
  • 추가 만료 쿠키 또는 임의 갱신을 정의해야 할 수 있습니다. (나는 2038 년 쿠키 만료 시간도 마찬가지로 비 사회적이며 적절한 시간 만 사용한다는 사실 때문에.)
  • 인증과 관련된 어떤 것도 사용할 수 없으며 사용자 및 표시 옵션 만 사용할 수 있습니다.
  • 실제 쿠키와 세션 쿠키의 의미 적 차이를 인식하는 것이 중요하다고 생각합니다. 그러나 아무도 그것을 보지 못한다면 여기에서 돌보는 것이 중요합니까?

그러나 그것은 내 데이터 프라이버시 두뇌 부분을 행복하게 만듭니다. 그리고에 대한 몇 가지 사용 사례 는 간단하게 생각할 필요 없다.


테스트 가능성

응용 프로그램을 "상태 확인"하는 빠른 스크립트를 의미하는 것이 아니라 대부분 쓸모가 없습니다. 코드의 대부분 또는 전체가 강력한 테스트에 포함되는 경우 귀하와 귀하의 고객은 잘 설계된 민첩한 코드의 혜택을받을 가능성이 더 큽니다.

가독성

다른 사람들이 귀하의 코드를 사용하고 나중에 업데이트 할 것입니다. 코드를 읽을 수 없다면 쓸모가 없습니다 (코멘트는 중요하지 않습니다). 변수의 이름을 적절하게 지정하고 컨텍스트에서 컨텍스트로의 흐름을 쉽게 식별 할 수 있어야합니다.

for ( $i=0; $i < count($myList); $i++)  // obviously an index
foreach ( $k as $a => $b ) // wtf?
foreach ( $definitions as $word => $definition ) // better

난독 화 (확장 주석)

이것은 내가 이전에 작성한 코멘트를 확장하여 더 많은 것을 알고 싶어하는 사용자로부터 많은 코멘트를 받았습니다. 따라서 이전 답변에서 분리했습니다.

많은 수의 웹 앱이 자바 스크립트 기반 (중심)이며, 클라이언트가 일반적으로 UI를 처리하고 대부분의 작업에서 백엔드를 지시하는 코드의 정말 중요한 부분에 액세스 할 수 있기 때문에 리버스 엔지니어링 기능은 엄청납니다. . 어느 시점에서 스크립트는 앱이 처리하는 많은 데이터를 포함하는 트래픽을 처리하거나 발생시킬 가능성이 높으므로 더 넓은 애플리케이션의 많은 기본 구조를 쉽게 노출 할 수 있습니다. 자신의 IP를 보호하기 위해 자주 간과되는 기술 중 하나는 코드를 난독 화하여 작성한 변수, 함수 및 객체의 진정한 목적을 숨기는 것입니다.

난독 화는 코드를 복잡하게 만드는 데 사용되는 기술입니다. 난독 화는 디 컴파일 될 때 코드를 이해하기 어렵게하지만 일반적으로 코드의 기능에는 영향을주지 않습니다. 난독 화 프로그램은 리버스 엔지니어링을 어렵게 만들어 Java 프로그램을 보호하는 데 사용할 수 있습니다.

난독 화 : http://en.wikipedia.org/wiki/Obfuscated_code

PHP를 사용하여 자바 스크립트 (JS)를 난독 화하는 것은 비교적 쉽습니다. 간단히 바꿀 용어 색인을 만들고 PHP를 사용하여 스크립트를 열고 해당 용어를 난독 화 된 대응 용어로 바꾸고 결과를 작성할 수 있습니다.

PHP에서 즉시 코드를 난독 화하는 것도 쉽지만 파일 / 인덱스의 크기에 따라 약간의 지연이 발생합니다. 즉석에서 JS를 난독 화한다는 것은 페이지가로드 될 때마다 기본 코드가 변경되는 것처럼 보이기 때문에 방문 / 페이지 뷰간에 값이 변경되어 노이즈 레이어가 추가된다는 것을 의미합니다.

앱에 난독 화를 도입하는 방법을 설명하기 위해 가능한 한 가지 구현을 살펴 보겠습니다. 이것은 훌륭한 PHP 스크립트 인 PHP Minify를 사용하여 설명 할 추가 이점을 제공합니다.

3 개의 자바 스크립트 파일, JS1, JS2 및 JS3가 있다고 가정합니다. 이러한 스크립트는 1, 2, 3 순서로 나타나야하며 현재 사용자에게 애플리케이션을 제공하는 마스터 HTML (또는 PHP) 파일의 헤더에 별도로 링크되어 있습니다. JS1 및 JS2는 jQuery 및 Prototype과 같은 선반 외부 프레임 워크입니다 (앱에 둘 다 없을 가능성이 있다는 사실을 무시하십시오). JS3는 자신의 함수, 변수, 객체, 클래스 등을 사용하여 JS1 및 JS2의 기능을 활용하는 자바 스크립트입니다. 지적 재산 (IP)이거나 법적, 재정적 또는 이기적 (!) 이유로 난독 화되어야합니다. .

분명히 우리가 JS를 난독 화 한 다음 더 발전시켜야하는 것은 도움이되지 않습니다. 우리가 함수를 'function_to_save_secret_info'라고 부르는 이유가 있습니다. 이것은 우리가 코드를 작성할 때 더 쉽게 만듭니다 (이는 왜 난독 화를 원하는지 강조하지만). 따라서 이상은 우리가 개발 한 JS 파일을 상식적인 이름으로 유지하는 것입니다. 그러면 사용자가 마스터 HTML / PHP 페이지를 요청할 때마다 난독 화 된 버전이 즉석에서 생성되어 제공됩니다. 그러나 우리는 이것을 어떻게합니까?

가장 좋은 방법 중 하나는 PHP Minify (http://code.google.com/p/minify/)를 사용하는 것입니다. PHP Minify에는 여러 가지 장점이 있습니다. 그중 하나는 스크립트를 단일 번들로 그룹화하고 제공하는 기능입니다. 따라서 헤더에서 JS1, JS2 및 JS3에 링크하는 대신 PHP Minify를 사용하여이 세 가지로 구성된 그룹을 설정하고 헤더에서이 그룹에 링크하므로 단일 참조 만 있습니다. 이것의 장점은 다음과 같습니다.

  1. 더 적은 HTTP 요청, 더 빠른로드 및 더 나은 캐싱 (3 개가 아닌 1 개)
  2. PHP Minify는 자동으로 그룹 내 스크립트를 압축하여로드 시간을 훨씬 더 빠르게 만듭니다 (또한 일종의 난독 화).
  3. JS 관리가 쉬워지고 그룹 변경이 쉽습니다.
  4. 코드를 검사하는 것이 덜 간단합니다.

이 작업을 수행하면 마스터 페이지가 PHP Minify 그룹에 연결됩니다.이 그룹은 훌륭하지만 여전히 동일한 콘텐츠를 효과적으로 제공하고 있습니다 (모두 더 나은 방식).

그러나 이제 우리가 할 수있는 것은 JS3에 대한 난독 화 루틴을 구축하는 것입니다. PHP Minify에서 스크립트 그룹을 정의하는 groupsConfig.php 스크립트에서 그룹을 변경하여 JS3.js를 JS3.obfuscated.js로 바꿉니다. 그러나 우리는 여전히 JS3.js의 일반 영어 버전을 가지고 있으며 JS3.obfuscated.js는 존재하지 않습니다.

따라서 기본적으로 메인 / 마스터 HTML / PHP 페이지는 헤더에있는 JS 그룹에 연결됩니다. 이는 그룹이 다음과 같이 정의 된 PHP Minify에 대한 참조입니다.

JS1.js
JS2.js
JS3.obfuscated.js

이제 우리가해야 할 일은 JS3를 난독 화하고 JS3.obfuscated.js를 출력하는 키 테이블 / 함수를 만드는 것입니다. 가장 간단한 수준에서 우리가하는 일은 다음을 포함하는 PHP를 작성하는 것입니다 (예를 들어, 이것은 최고의 코드가 아닙니다).

$terms_to_obfuscate=array(
   'my_secret_function',
   'my_secret_object',
   'my_secret_variable'
)

foreach ($terms_to_obfuscate as $key => $value) {
   //replace base64_encode(md5(rand(0,999))) with whatever you want to produce an obfuscated term
   $obfuscated_terms[]=base64_encode(md5(rand(0,999)));
}

$source_js=file_get_contents('JS3.js');
$fh = fopen('JS3.obfuscated.js', 'w+') or die("can't open file");
$obfuscated_js = str_replace($terms_to_obfuscate, $obfuscated_terms, $source_js);
fwrite($fh, $obfuscated_js);
fclose($fh);

What this script will do, is open our english language version of JS3, look for the terms we want to obfuscate and replace with randomised content, writing the output to JS3.obfuscated.js. If we place this code ABOVE the group definition in PHP Minify, it will run each time the JS group is called...so each time the underlying master HTML/PHP page for our application loads, our script is randomly obfuscated. Note, this may not be the best implementation in all cases, this is illustrative only.

This is only one possible way of accomplishing obfuscation, but what we now have is compressed JS served faster to our users, randomly obfuscated, and we can still develop our script in 'plain english'. All we have to do is update our list of terms to obfuscate. There are better ways of doing this, this is meant only as an illustration and not a definite, of the general ideas behind the concept.

It is important to note, that obfuscation may only be appropriate for certain projects (it is not particularly open source by any means), and is not a total protection against reverse engineering, but should be viewed as more of a stumbling block for those less determined.


Human-UNREADABLE and very secure session cookies

I believe that human-readable cookies, when they refer to session things (ie autologin) are a security threat. From the experience with PHP-Nuke, which was full (years ago, around version 7) of admin login exploits, I became to encrypt cookies. Also, since cookies are almost all transmitted in clear, I became to bind them to the IP, or better the subnet.

I18n, l10n

Localization is important. I never write human-readable text in pages, I prefer making the website in English and Italian using a shared string library. Usually I override with English words those strings that are not yet translated to avoid displaying bad string IDs

Theming support

A web application looks very professional to my eyes if user can change theme during their browsing. Theming means not only CSS, but also all the graphics (icons, buttons) must be changeable without touching the core. When I wrote phpMyBitTorrent up to 1.2 version I paid lots and lots of attention to theming, which unfortunately resulted in the same exact layout being exposed with different colours/fonts/images. The next-generation theming is templating, so you can completely change the appearence of your website. I believe it's easier to template your website when you use MVC pattern.

Cross-database support

Or, better, DB idependence. I don't like calling explicitly mysql_query() in my code. I prefer running queries onto an abstraction layer that allows me to change DBMS (ie. to SQLite or Oracle) without rewriting the code of the core components.

Logging

Logging is the best way to ease debugging and to collect useful information for FFDA (field failure data analysis). Apache log4php does the trick but you must properly instrument your code with adequate logging statements to get usable information. Lots of academic studies demonstrate that developers never achieve an adequate level of logging: they log too much or not enough, and often faults remain unclear because of missing or unclear logging statements. Unfortunately, logs grow fat with time, so you must be able to keep only those records that may help you find issues about your applications. Logs can also be used for performance purposes, but never forget the overhead logging introduces. Finally, my current senior grade thesis is about a scientifically-proven set of logging rules that are suitable for FFDA in complex applications, to which every developer should take a look.

ORM

Well, this final point is more about cross-database support. To tell you the truth, I became to use NHibernate ORM when I abandoned PHP for ASP.NET. If I had to resume PHP, I would first find a suitable ORM to avoid queries in my code.

These are my smart ideas

참고URL : https://stackoverflow.com/questions/3799930/features-functions-that-make-your-app-more-professional-coding-hobbyhorses

반응형