programing

앱을 보다 전문적으로 만드는 기능/기능은 무엇입니까?코딩 취미용 말

stoneblock 2023. 8. 12. 09:47

앱을 보다 전문적으로 만드는 기능/기능은 무엇입니까?코딩 취미용 말

PHP 웹 애플리케이션에서 어떤 기능을 구현(어떻게)합니까? 어떤 면에서 "더 전문적"이라고 생각하기 때문입니까?아니면 개인적인 트집이나 코드 취미용 말, 특히 중요할 수 있는 작은 것들이 있습니까?올바르게 작동하기 위해 과도한 시간을 소비하는 저장되지 않은 코드나 부차적인 기능은 무엇입니까?

.

Q&A 그림을 위한 취미용 말 코딩 예제:

구성 데이터가 데이터베이스에 없음:필요성과 효율성의 문제이기도 한 애플리케이션 데이터!= 구성 데이터.

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

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

콘텐츠 협상:RSS와 Atom 형식 사이의 단순한 변형에 적합합니다.하지만 자주 사용되지 않는 것을 봅니다.

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

.

힌트(규칙 아님)

  • 그렇다면, 어떤 기능이 당신의 웹 애플리케이션을 평균 이상으로 만든다고 생각하십니까?
  • 왜 그것은 흔하지 않습니까?
  • 사용자에게 이익이 되지만 간과하기도 쉽습니까?
  • 보다 전문적이고 안전한 코딩 제안이 매우 많이 논의되고 있습니다.그들은 항상 그래요.
  • 그러나 이 Q&A의 의도된 범위실제로 흔치 않은/독특한 기능이며, 비표준적이고 논란이 많은 기능일 수 있습니다.매혹적인 것에 대한 큰 보너스.
  • 그것은 또한 PHP에서 우연히 구현된 코딩 선호도와 니트로픽에 관한 것입니다.
  • 너무 크게 생각하거나 너무 높게 생각하지 마세요.작은 기능도 중요합니다.
  • 가능한 경우 코드를 표시합니다.
  • 그러나 구문 및 코딩 스타일/패러다임은 대부분 주제에서 벗어났습니다.
  • 그리고 유용성이나 코드 품질에 대해 논쟁하지 맙시다.이것은 순전히 특징 및 코드 조사입니다.

번째 특징은 연구 현상금 라운드입니다.많은 좋은 아이디어 중 하나를 결정하는 것은 어려웠습니다.사실, 나는 그것을 5개의 선호도로만 좁힐 수 있었고 결정을 맡겼습니다.rand()그리고 이 주제는 분명히 두 번째 현상금을 걸 수 있을 만큼 충분히 흥미롭습니다.좁히기 위해 .그리고 아마도 다른 누군가가 그 범위를 다듬기 위해 그 자리를 차지할지도 모릅니다.

설명서.

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

보안, 특히 사용자의 개인 데이터에 주의합니다.

bcrypt와 같은 강력한 해시를 사용하여 암호 저장(설명서 참조):

// 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를 사용합니다. GitFlow는 사용하는 동안 조금 더 오래 걸리지만 완성된 프로젝트에서 훨씬 더 인상적인 모습을 보여줍니다.클라이언트가 github 그래프(또는 동등한 그래프)를 볼 수 있는지 확인합니다.저 나뭇가지들은 모두 깔끔하고 인상적으로 보입니다. (실제로 유용할 뿐만 아니라!)

관련:
이슈 추적 시스템.
코드가 완료되기 전(클라이언트가 검토하는 동안)과 이후에 모두 새 작업을 추가할 수 있습니다.
업무를 구분하고 더 많은 일을 얻는 방법일 뿐만 아니라 고객이 그 프로젝트가 아직도 마음에 걸려 있다는 느낌을 받게 합니다.제가 넘어갔지만 말입니다.
저는 Collabive를 사용합니다. 이 시스템들은 정말 끔찍합니다. 하지만 제가 시도한 다른 어떤 것보다 더 인상적으로 보입니다. 인상적으로 보이는 것들은 전문적인 것으로 간주됩니다.

암호 강도/일치

암호를 등록하거나 변경할 때 암호의 강도 약점을 대화형으로 사용자에게 알립니다.또한 입력할 때 확인 결과가 일치할 때 통보합니다.

실시간 양식 확인

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

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

암호화된 오류 메시지를 사용하지 마십시오. 일반적으로 올바른 오류 메시지에 대해 찾을 수 있는 최상의 사례를 참조하십시오.최상의 경우, 이를 위해서는 일반적으로 좋은 톤의 목소리를 유지하는 등의 임무를 수행하는 재능 있는 카피라이터가 필요합니다.

이는 확실한 예외 처리 및 우수한 방어 프로그래밍과 함께 제공됩니다.

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

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

외부 라이브러리인 것처럼 코드를 작성합니다.당신이 상업적이고 폐쇄적인 응용 프로그램을 다루더라도 그것을 오픈 소스 프로젝트로 취급합니다.기존 코드의 동작을 변경하지 않고 변경하려는 다른 사용자에 대해 생각해 보십시오.type inhinding을 사용할 때는 인터페이스가 클래스가 아닌지 확인해야 할 수 있습니다.

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(수영 방법)과 비슷한 제목의 제목을 가진 비디오) 등.

사용자가 웹 사이트를 사용자 지정할 수 있습니다.최근 비디오, 최근 사진, 최근 활성 스레드, 뉴스, 홍보 갤러리 등과 같은 여러 "상자"가 있는 홈페이지가 있다고 상상해 보십시오.사용자가 이 중 일부를 숨기고 순서를 변경할 수 있습니다. 누군가는 뉴스와 스레드보다 사진과 비디오에 더 관심이 있어 페이지 맨 위에 올리고 싶을 수도 있고, 다른 사용자는 다른 기본 설정을 받고 다른 순서를 원할 수도 있습니다."디스플레이: 5, 10, 20개의 최근 비디오"와 같은 각 상자의 기본 설정을 추가합니다.

사용자 경험을 향상시키고 앱을 보다 전문적으로 만들 수 있지만 백엔드를 처리하는 몇 가지 포인트를 혼합에 추가하려면:

양호함
종종 웹 앱은 로드 시와 사용 중에 많은 수의 요청을 보냅니다.최소화는 CSS 스프라이트 및 GZiping 콘텐츠의 사용과 마찬가지로 초기 부하 중량을 줄이는 데 도움이 될 수 있습니다.응용프로그램을 최대한 빠르게 간소화하고 빠르게 만드는 데 도움이 되는 좋은 방법은 Firefox의 Firebug Extension용 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 Apache의 은 다음과 .
검색 환경을 개선하고 논리적으로 파일된 콘텐츠의 인상을 제공하기 위해 깨끗한 URL을 제공하는 기본적인 이점 외에도, 좋은 .htaccess 파일은 사이트에 보안 계층을 추가하고 콘텐츠 서버 측을 압축하며 추가 식별자를 추가할 수 있습니다(예: E-Tags의 이점은 논쟁의 여지가 있지만).또한 모든 웹 앱에는 잘 작성된 .ht 액세스 권한이 있어야 합니다.

확인 (페이지는 영문일 수 있음)
모든 개발자에게 모든 출력 코드가 유효, 주석 처리, 논리 및 정리인지 확인하기 위해 가장 광범위한(합리적인) 범위로 이동할 것을 항상 강력히 권장합니다.W3C는 HTML 뿐만 아니라 웹 앱이 어떻게 작동해야 하는지를 명확하게 지정하는 훌륭한 작업을 수행합니다.그들의 지침에 따라 당신이 작성하는 모든 것의 호환성을 높이고, 당신이 그것을 어떻게 생각하는지 모든 사람에게 적용되도록 하라.

몇 가지 훌륭한 도구:

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

Javascript 측면에서 JS 린트는 JS의 버그(확인할 때 성능에 영향을 미치지 않을 수 있음)를 모두 제거할 수 있는 훌륭한 도구입니다.

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

그리고 개발을 돕기 위해, 자동화된 JS는 개발을 위해 코드를 더 잘 구성할 수 있도록 도와줄 수 있습니다. http://jsbeautifier.org/

물론 PHP도...http://beta.phpformatter.com/

마지막으로, 약간 덜 흑백인 것.
인간화

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

37 신호와 같은 프로젝트를 생각해 보면, 매력적인 요소 중 하나는 프로젝트(코드) 자체가 인간화되어 있고 특성을 가지고 있다는 느낌을 사용자에게 전달하여 사용자를 앱에 끌어들이고 연결하는 데 도움을 주며, 사용의 즐거움과 다른 사람들과의 소통을 장려한다는 것입니다.저는 앱이 '살아있는' 것처럼 보인다는 뜻이 아니라, 더 '접근 가능'하다고 느끼고 사용자들이 그것으로 '식별'할 수 있다는 것을 의미합니다.

그러나 이는 사용자가 앱/코드/프레임워크/경험에 거의 '공감'을 느끼게 하여 사용자가 이를 사용하도록 유도하는 탐구인 인간화 코인의 한 측면에 불과합니다.다른 면은 앱과 그 뒤에 있는 앱들 사이의 경계를 허물어버리는 것입니다.

우리 모두는 우리가 사용하는 것의 배후에 있는 사람, 사람 등을 알고 싶어합니다. 그들로부터 많은 정보를 전달하고 종종 그것을 앱 자체에 논리적으로 적용하며 실제로 우리의 '좋아요'(예: 스티브 잡스, 애플 구매 등).명백히 무례한 예이긴 하지만).어려움이 발생했을 때 실제 사람과 연락할 수 있는 경로를 갖는 것은 간단한 단계 중 하나이며, 개발자 블로그, 뉴스 스트림 등을 갖는 것입니다. 앱 주변에 인간화된 메타버스를 구축하는 것은 신뢰성을 제공하며, 부분의 합보다 더 클 수 있다는 느낌을 줍니다.

분명히 인간화는 여기도 저기도 아닐 수 있습니다. 그리고 그것은 확실히 매우 어려운 일입니다. (다른 사람들이 다른 친구들을 가지고 있는 것과 같은 방식으로) 그러나 개발자가 더 임상적이고 외과적인 앱의 가장자리를 사포로 만들고 더 편안하고 접근하기 쉽고 재미있게 만들 수 있는 어떤 방법이든 제 책에서 매일 사용자가 승자입니다.

등록 없음강
이것은 일상적인 웹 응용 프로그램에서 흔히 발생하는 문제입니다.강제 계정 등록은 사용자에게 친숙하지 않습니다.스팸과 오용을 방지하는 것이 요즘 필수입니다.하지만 그것은 입양을 방해합니다.

Stackoverflow에 대해서는 누구나 들어보셨을 겁니다.그들은 등록을 강요하지 않습니다.계정 없이도 파티에 참여할 수 있습니다.등록을 강제하는 대신 체계적으로 장려합니다.그러나 중요한 점은 적어도 시작하기 전에 점차 익숙해질 수 있는 옵션이 있다는 것입니다.

간단한 개념입니다.하지만 이 역시 구현하기 어렵습니다.임시 및 선택적 사용자 계정을 처리할 수 있는 경우는 거의 없으며, 기본 애플리케이션 로직과 데이터베이스 구조를 준비해야 합니다.구현 노력과 상관없이 이것이 중요하고 숙원이 되는 특징이라고 생각합니다.

종종 간과되는 것 중 하나는 인쇄 가능한 CSS입니다.쓰기는 힘들지만 응용프로그램의 일부 데이터를 인쇄하려는 사용자에게는 많은 차이가 있습니다.

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

연속점

예:양식을 제출하면 리디렉션되고 이제 랜딩 페이지에 알림이 표시됩니다.대부분의 사이트는 해당 알림을 세션에 저장합니다.즉, 다음에 액세스하는 모든 페이지에 해당 메시지가 표시됩니다.대부분의 경우에는 문제가 없지만, 제 마음에는 정말 지저분합니다.세션은 다음 요청 데이터가 아닌 세션 데이터를 위한 세션인 것 같습니다.

내 솔루션:어레이를 생성하고 데이터(알림 등)를 해당 어레이에 쓴 다음 sessionid + 고유 식별자를 사용하여 memcache에 저장하고 리디렉션에 __continuation={that unique identifier} 매개 변수를 추가합니다.그런 다음 다음 페이지에서 해당 데이터를 다시 로드하고 처리합니다.

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

질문이 있나요?

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

예: URL "수정"
http-URL의 경우 모든 브라우저가 처리하는 것처럼 경로 조각을 필수로 처리합니다.따라서 저는 사용자 입력 및 가져온 데이터를 "수정"하고 이러한 값을 표시하거나 저장하기 전에 항상 에 슬래시(예: http://example.org )를 추가합니다.아마도 "uber professionalism"은 아니지만 URL을 정규화하면 나중에 URL을 쉽게 처리할 수 있습니다.그리고 몰라요, 그냥 "더 나은" 것 같아요.

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

그래서 나는 항상http://example.org/가치관에 있어서, 무슨 일이 있어도.이것은 당신의 HTML을 더 이상 표준을 준수하게 만들지는 않지만, 그것은 단지 나의 불만 중 하나입니다.

UIUI에 . ID 음
대부분의 데이터베이스 개체는 일부 대리 키로 열거됩니다.제가 보기에 멋이 없어 보이는 것(때로는 보안 함정일 수도 있음)은 URL에서와 같이 UI로 유출하는 것입니다.어떤 일이 일어나도 그것은 큰 문제가 아닙니다.user.php?id=37310843안으로user.php?name=title그리고 데이터베이스가 ID나 이름을 검색하는 것은 거의 차이가 없습니다.의 어리석음이 , 것입니다.

  • 적절한 ORM을 사용하면 데이터베이스 내부 ID가 애플리케이션 로직에 유출될 필요가 없습니다.
  • 위키백과를 전시합니다. 페이지 제목 대신 대리 키를 사용했다고 상상해 보세요.(CoWiki 참조)
  • 외부 링크가 항상 동일한 내용을 가리키도록 하려면 대리 키를 사용하지 않도록 해야 합니다.정확한 할당이 필요할 정도로 중요한 경우 GUID를 사용해야 합니다.

모든 2.0 웹 앱이 가질 것으로 예상되는 중요한 것 중 하나는 -입니다.

  1. 검색 - 전체 텍스트 검색, 키워드 검색, 자동 제안 또는 (가장 최근의) 실시간 검색 여부.이 기능이 없으면 사이트(특히 검색 엔진이 차단된 사이트)를 방문할 때 숨이 막힙니다.한정자는 현대 2.0 사이트에 대한 PHP가 있어야 합니다.
  2. MVC 프레임워크 - 이것은 웹 개발(PHP에 얽매이지 않음)과 관련이 있기 때문에 모델-뷰-컨트롤러 프레임워크는 필수입니다.과도한 코드 기반과 빠른 반복 주기로 인해 적절한 구조화는 향후의 번거롭고 추적 불가능한 버그를 방지하기 위해 반드시 필요합니다.
  3. AJAX - 이에 대해 말해야 합니다 :) 그것은 우리 대부분이 웹사이트를 검색하는 방식을 변화시켰습니다.AJAX를 통해 웹 사이트를 사용할 수 있는 멋진 기능입니다.
  4. 디버그 정보 - 앱이 충돌할 때 사용하는 정보입니다.무엇이 잘못되었는지 어떻게 찾습니까?로그를 관리하고 있습니까?로그(발생 후 몇 시간)에서 문제의 원인을 추적할 수 있습니까?로그를 얼마나 자세히 기록해야 합니까?
  5. 미니화된 Javascript & CSS - 로딩 시간을 줄이고 사이트를 더 빠르게 만들어 사용자가 사이트를 탐색하는 동안 더 편안함을 느낄 수 있습니다.
  6. 캐싱 - 다시 사용자가 인식하는 응답 시간을 크게 늘려 사이트를 "전문가"로 만듭니다.

복합 응용 프로그램

온라인 상거래 시스템을 실행하고 있는데 카드 결제 공급업체가 오프라인 상태가 된다면 고객은 여전히 제품을 검색하고 다른 결제 방법을 사용하여 체크아웃할 수 있어야 하지 않을까요?

응용프로그램은 전체 사이트를 "유지관리 모드"로 전환하지 않고 응용프로그램의 페이지나 부분을 정상적인 방법으로 사용할 수 없게 하고 다른 사용자가 사용할 수 있도록 "스위치"를 설정해야 합니다.

복합 응용프로그램은 이름이 무색할 수도 있지만, 더 나은 방법이 있을 것이라고 확신합니다. 하지만 많은 사람들이 사용 가능한 응용프로그램을 개발할 때 이 접근법은 확실히 잊어버리기 쉬운 방법 중 하나입니다.

지능적인 브루트 포스 보호

응용프로그램에 많은 고객 정보를 저장하는 관리 파트가 있다고 가정해 보겠습니다.아무도 손에 넣지 않았으면 하는 데이터입니다.비록 당신이 당신의 비밀번호를 해시하기에 좋은 좋은 소금과 좋은 알고리즘을 가지고 있더라도, 악의적인 사용자는 여전히 당신의 로그인 양식에 대해 DOS/무지개 테이블 공격을 수행할 수 있습니다.

첫 번째 옵션은 이러한 공격을 수행하기 위해 자동화된 소프트웨어를 사용하는 것이며, 암호를 정규화된 추측을 통해 수동으로 수행함으로써 보조적으로 공격을 수행하는 것입니다.구글을 사용하여 사용자의 비밀번호를 추측할 수 있는 충분한 정보를 찾는 것은 정말 쉽습니다.또한, 만약 여러분이 스웨덴과 같은 나라에 살고 있다면 - 당국에 전화 한 통만 걸어도 알 수 있는 정보가 많지 않습니다 - 사회 보장 번호, 파트너 이름, 결혼 상태, 자녀 이름,애완동물과 일반 사용자를 위한 매우 한정된 비밀번호 추측으로 함께 제공되는 훨씬 더 많은 정보.

일반인이 암호를 선택하는 방법을 살펴보면 보안이 정말 쉽게 손상될 입니다.물론 사용자 암호의 길이, 특수 문자 등에 대한 제한을 설정할 수는 있지만 상황에 영향을 미치지는 않습니다.무차별적인 공격이 계속될 수 있습니다.

사용자가 로그인을 시도하다가 알 수 없는 IP에서 두 번째 시도에 실패할 경우 자동 로그인을 방지하기 위해 retakecha가 표시되어야 합니다.다시 n번의 시도가 실패하면 계정이 완전히 잠기고 로그인을 수행하기 전에 다시 활성화해야 합니다.

자동화된 공격이 성능 저하를 방지하려면 설정된 시간 내에 로그인 시도에 실패한 IP가 다시 수동으로 화이트리스트에 추가될 때까지 로그인 페이지에 액세스하지 못하도록 완전히 차단하는 것이 좋습니다.

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

이것이 없다면 고통스러운 이슈와 빈 공간, 그리고 데이터 유형 검사를 계속해야 할 것입니다.이것은 제가 가장 좋아하는 기능입니다.

보다 전문적인 코드를 만드는 것은 유닛 테스트, 문서화 버전 제어 및 먼저 수행합니다(실패한 경우 스택 오버플로로 되돌립니다).

/**
 * 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 및 Postgre와 같은 것에서 실행할 수 있습니다.운영을 위한 SQL 또는 MySQL.

(중략) Javascript 비활성화 시 알림

JS가 꺼지거나 비활성화된 상태로 스택 오버플로에 가본 적이 있습니까?가끔 스크립트가 켜져 있지 않다는 것을 잊어서 도움이 되는 말을 합니다.그러면 다시 켤지 여부를 결정할 수 있습니다. 하지만 적어도 앱이 형편없다고 생각하기보다는 기능이 부족하다는 것을 알고 있습니다.

Firebug/Javascript 로깅

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

전체 사이트 SSL/TLS 암호화

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

Firesheep은 이제 일반적인 Joe에게도 두 번 클릭 작업을 제공하기 때문에 전체 사이트 암호화는 더 이상 사치품으로 취급되지 않습니다. (호환 가능한 브라우저가 보안되지 않은 요청으로 실수로 유출되지 않도록 세션 쿠키에 보안 플래그를 설정하는 것과 함께) 확장도 문제도 해결되지 않습니다.

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

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

레지스트리 시스템.

개체 및 범위 문제를 저장하는 것과 관련하여 이전에도 여러 번 말했지만, 이 문제를 해결하는 가장 좋은 방법은 정적/추상 클래스를 사용하는 것입니다. 정적/추상 클래스는 응용 프로그램 주변에서 개체를 전송하고 클래스를 수정하여 사용할 수 있도록 하는 데 도움이 클래스를 수정할 필요가 없습니다.

클래스는 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];
    }
}

그 수업의 단순성을 보면 두려워할 것도 없고, 이 방법을 채택하기 위해 현재의 프레임워크/응용 프로그램을 수정하도록 만들 것도 없지만, 어떻게 작동하는지 확실하지 않다면 몇 가지 예를 들어보겠습니다.

우선 우리가 가지고 있다고 합시다.index.php을포하여를 startup.php 그안서 내에서.startup.php코드를 할 때 합니다.

  • 데이터베이스
  • 세션
  • 파일라이터
  • 입력
  • 산출량

이제 만약 당신이 그것을 사용하고 싶다면.FileWriter 내에서 Database " 적으사변용다같습음다니과수는는되로일반"라는 를 가지고 .$FileWriter그리고 당신은 글로벌 키워드를 사용할 것입니다.Database

그러나 다음을 수행합니다.

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 그럼 object /.

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단순하고 안전하게 청소할 수 있습니다.

재미있게 읽으셨길 바랍니다.

나는 이것이 끔찍한 코드이고 부결될 만하다는 것을 압니다.컨텐츠 협상이 실제로 달성하기 쉽다는 를 들어 보겠습니다.

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 이 작업은 다른 SQL 테이블보다 파일(ini) 저장소를 안전하게 설정하고 수정하는 작업이 더 많이 수반되기 때문에 종종 게을러서 수행됩니다.
  • 데이터베이스 저장소 없이는 사용자 설정 및 도메인별 구성을 관리할 수 없습니다.

실제로 필요한 경우는 거의 없지만 실제로 사용자가 런타임 구성을 편집할 수 있기를 바랍니다(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
}

즉, 코드 루프가 발생할 때마다 카운트 함수가 실행되므로 비효율적입니다.다음을 수행하는 것이 훨씬 좋습니다.

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

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

문자열을 처리하고 있고 PHP 등가물이 있는 경우, stripos, strncasecmp 및 strpbrk가 더 빠릅니다.strr은 preg_replace보다 약 5배 더 빠릅니다. regExp 대신 유효성 검사를 구성하는 데 ctype_alnum, ctype_alpha 및 ctype_digit을 사용할 수 있습니다.

작업 공간 청소

DB 연결을 완료한 후에는 항상 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';

자동 Permal 링크

이 기능을 사용하면 누구나 링크의 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

난독화(확장댓글)

이것은 제가 이전에 했던 코멘트를 더 알고 싶어하는 사용자들로부터 많은 댓글을 끌어 모았던 것을 확장하기 위한 것입니다.그렇기 때문에 저는 그것을 이전 답변에서 분리했습니다.

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

난독화는 코드를 복잡하게 만드는 기술입니다.난독화는 코드가 컴파일 해제될 때 코드를 이해하기 어렵게 하지만 일반적으로 코드의 기능에 영향을 미치지 않습니다.난독화 프로그램은 자바 프로그램을 역엔지니어링하기 어렵게 하여 프로그램을 보호하는 데 사용될 수 있습니다.

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

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

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

앱에 난독화를 도입하는 방법을 설명하기 위해, 저는 가능한 구현 중 하나를 검토할 것입니다. 이것은 훌륭한 PHP 스크립트인 PHP Minify를 사용하여 설명될 추가적인 이점을 제공합니다.

JS1, JS2, JS3의 Javascript 파일이 3개 있다고 가정합니다.이러한 스크립트는 1, 2, 3 순서로 나타나야 하며, 현재는 사용자에게 애플리케이션을 전달하는 마스터 HTML(또는 PHP) 파일의 헤더에 별도로 연결되어 있습니다.JS1 및 JS2는 (예:) jQuery 및 Prototype와 같은 외부 프레임워크에서 제외됩니다(애플리케이션에 둘 다 없을 가능성이 높다는 사실은 무시).JS3는 JS1과 JS2의 기능을 자신의 함수, 변수, 객체, 클래스 등을 사용하여 활용하는 당신의 Javascript입니다.이는 귀하의 지적 재산권(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에서 스크립트 그룹을 정의하는 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);

이 스크립트가 수행할 작업은 JS3의 영어 버전을 열고 난독화하고 싶은 용어를 찾고 무작위 콘텐츠로 대체하여 출력을 JS3.obfuscated.js에 기록하는 것입니다.이 코드를 PHP Minify의 그룹 정의 위에 놓으면 JS 그룹이 호출될 때마다 실행됩니다...따라서 응용프로그램의 기본 마스터 HTML/PHP 페이지가 로드될 때마다 스크립트가 무작위로 난독화됩니다.참고로, 이것이 모든 경우에 최선의 구현은 아닐 수 있습니다. 이것은 예시적인 것일 뿐입니다.

이것은 난독화를 달성하는 유일한 방법이지만, 현재 우리가 가지고 있는 것은 사용자들에게 더 빨리 제공되는 압축된 JS이며 무작위로 난독화되고 여전히 '평범한 영어'로 스크립트를 개발할 수 있습니다.우리가 해야 할 일은 용어 목록을 난독화하기 위해 업데이트하는 것입니다.이를 위한 더 나은 방법이 있습니다. 이는 개념 뒤에 숨겨진 일반적인 아이디어에 대한 명확한 설명이 아니라 설명으로만 의미가 있습니다.

난독화는 특정 프로젝트에만 적합할 수 있으며(어떤 방법으로든 특별히 오픈 소스는 아님) 역설계에 대한 완전한 보호는 아니지만, 결정력이 낮은 프로젝트에게는 장애물로 간주되어야 합니다.

사람이 읽을 수 없는 매우 안전한 세션 쿠키

저는 사람이 읽을 수 있는 쿠키가 세션 항목(즉, 자동 로그인)을 언급할 때 보안 위협이 된다고 생각합니다.(몇 년 전 버전 7 전후) 관리 로그인 악용이 가득했던 PHP-Nuke에 대한 경험을 통해 쿠키를 암호화하게 되었습니다.또한, 쿠키가 거의 모두 투명하게 전송되기 때문에, 저는 쿠키를 IP에 바인딩하거나 서브넷을 개선할 수 있게 되었습니다.

I18n, l10n

현지화는 중요합니다.저는 사람이 읽을 수 있는 텍스트를 페이지에 쓰지 않습니다. 공유 문자열 라이브러리를 사용하여 영어와 이탈리아어로 웹 사이트를 만드는 것을 선호합니다.일반적으로 저는 잘못된 문자열 ID를 표시하지 않기 위해 아직 번역되지 않은 문자열을 영어 단어로 덮어씁니다.

주제 지정 지원

사용자가 검색하는 동안 테마를 변경할 수 있다면 웹 애플리케이션은 매우 전문적으로 보입니다.Ming은 CSS 뿐만 아니라 모든 그래픽(아이콘, 버튼)이 코어에 닿지 않고 변경 가능해야 한다는 것을 의미합니다.제가 1.2 버전까지 phpMyBitTorrent를 작성했을 때 저는 주제에 많은 관심을 기울였는데, 불행히도 동일한 레이아웃이 다른 색상/글꼴/이미지로 노출되었습니다.차세대 테마는 템플릿 방식이므로 웹 사이트의 모양을 완전히 변경할 수 있습니다.당신이 MVC 패턴을 사용할 때 당신의 웹사이트를 템플릿화하는 것이 더 쉽다고 생각합니다.

데이터베이스 간 지원

또는 DB 독립성이 더 좋습니다.나는 내 코드에서 mysql_query()를 명시적으로 부르는 것을 좋아하지 않습니다.핵심 구성 요소의 코드를 다시 쓰지 않고 DBMS(즉, SQLite 또는 Oracle로)를 변경할 수 있는 추상화 계층에서 쿼리를 실행하는 것을 선호합니다.

로깅

로깅은 디버깅을 용이하게 하고 FFDA(현장 고장 데이터 분석)에 유용한 정보를 수집하는 가장 좋은 방법입니다.Apache log4php는 유용하지만 사용 가능한 정보를 얻으려면 적절한 로깅 문으로 코드를 올바르게 계측해야 합니다.많은 학술 연구에 따르면 개발자들은 결코 적절한 수준의 로깅을 달성하지 못합니다. 즉, 로그가 너무 많거나 충분하지 않으며, 로그 문이 없거나 명확하지 않기 때문에 종종 오류가 명확하지 않은 상태로 남아 있습니다.안타깝게도 로그는 시간이 지남에 따라 비대해지기 때문에 애플리케이션에 대한 문제를 찾는 데 도움이 될 수 있는 레코드만 보관할 수 있어야 합니다.로그는 성능을 위해 사용할 수도 있지만, 오버헤드 로깅으로 인해 발생하는 비용을 잊지 마십시오.마지막으로, 저의 현재 고학년 논문은 복잡한 응용 분야에서 FFDA에 적합한 과학적으로 입증된 로깅 규칙 세트에 관한 것으로, 모든 개발자가 이를 살펴봐야 합니다.

ORM

마지막 요점은 데이터베이스 간 지원에 관한 것입니다.사실 저는 ASP용 PHP를 포기하면서 NHibernate ORM을 사용하게 되었습니다.NET. PHP를 다시 시작해야 한다면, 먼저 코드에서 쿼리를 피하기 위한 적절한 ORM을 찾을 것입니다.

이것들은 나의 현명한 생각들입니다.

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