2010-03-28 3 views
7

PHP의 페이지간에 신용 카드 정보를 안전하게 전달하는 방법은 무엇입니까? 나는 전자 상거래 응용 프로그램을 구축, 그리고 난 이런 식으로 체크 아웃을 통해 이동 사용자를하고 싶습니다 :PHP의 페이지간에 신용 카드 정보를 안전하게 전달하는 방법

입력 정보 -> 검토 ->의 Finalize 주문

문제는 내가 어떻게 안전하게에게 확실하지 않다이다 사용자가 입력 한 시점부터 처리 할 때까지 신용 정보를 전달합니다 (주문 완료 단계에서). 세션을 사용하는 것이 암호화 된 경우에도 안전하지 않다고 들었습니다.

도움이 될 것입니다.

+1

이것은 잘못된 생각입니다. 실질적인 이익이 없으면 증가 된 위험을 처리해야합니다. 지불 게이트웨이는 어쨌든 신용 카드 번호를 확인할 수 있으며 세션 데이터는 공격에 노출되어 있으며 화면의 CC 번호는 어딘가에 캐시 될 수 있습니다. – Rimian

+0

동일한 페이지에서 확인 및 지불 정보를 결합하십시오. –

답변

1

글쎄, 먼저 HTTPS 프로토콜을 사용하여 연결이 암호화되어 있어야합니다.

그런 다음 데이터를 $_SESSION 수퍼 글로벌에 저장할 수 있습니다. 데이터는 서버에 저장되므로 비교적 안전합니다.

키가 GUID이거나 매우 무작위이고 고유 한 Order 데이터베이스에 정보를 삽입하는 것과 유사한 기술을 사용할 수 있습니다. 사람이/수정 순서를 검토로 전환 될 때 그런 다음, 당신은 주문 ID는 URL의 GET 부분에 저장되어 있어야합니다 (또는 당신이 쿠키/세션 변수 편집증 환자 인 경우) :

https://example.com/order?orderID=akjgflkhaslasdfkjhalsdjkljahs 

으로 추가 보안을 제공하면 주문 테이블에 IP 주소를 저장하고 IP와 주문 ID가 일치하는지 확인할 수도 있습니다.

+0

가능하면 서버에 정보를 저장하지 않으려 고합니다. – Alex

+2

@Alex 확인 페이지가 서버에서 요청되었습니다. 다른 곳에 저장할 것입니까? 고객 입장에서? – Rimian

+8

이것은 $ _SESSION이 일반 텍스트로 하드 드라이브에 데이터를 기록하기 때문에 PCI-DSS 위반입니다. – rook

0

내 전문 분야는 아니지만 세션에 저장하고 싶지만 CSRF 공격을 피하기 위해 "싱크로 토큰"(또는 요즘 아이들이 뭐라고 부르든간에)을 사용하고 싶다고 생각합니다. 물론

, 당신은 '

10

내가 같으면 등, 등, 전혀 반응에 매우 민감한 정보를 넣어 피할 URL과 숨겨진 필드에 민감한 데이터를 피하고, HTTPS를 (제대로)를 사용하여되고 싶어 어디서나 보관하십시오. 너무 위험하고 윤리적이지는 않습니다.

https를 통해 양식을 게시하여 지불 게이트웨이에 요청을 보내고 트랜잭션 결과 만 저장하십시오.

트랜잭션이 승인되었거나 거부 된 경우에만주의해야합니다. 숫자가 무엇인지 누가 신경 쓰나요?

+0

카드 정보를 저장하지 않으려는 경우 (나쁜 생각은 아닙니다), 결제 정보 제출 양식을 처리하는 데 사용하는 PHP 스크립트가 지불 게이트웨이 또는 어디로 가야하는지에 관한 정보. 즉, 신용 카드 정보는 결제 과정의 일부로 요청해야합니다. –

+1

+1, CC 정보를 입력하기 전에 _ 일반적으로 주문을 검토하는 것이 일반적입니다. 비즈니스 로직은 바로 뒤에 있습니다. –

+2

실제로 정확한 배송/결제 정보를 넣으려면 정보를 입력 한 후 많은 사이트 (amazon, newegg 포함)에 검토/확인 페이지가 있습니다. – Alex

8

세션에 신용 카드 정보를 저장하지 마십시오. 데이터베이스에 저장하지 말고 파일에 저장하지 마십시오. 대신 cc 정보를 숨겨진 HTML 입력으로 검토 페이지에 다시 작성하십시오.

그래서 프로그램의 흐름은 다음과 같이 작동합니다 : HTML 양식을 통해 서버에

  1. 사용자 게시물 지급 및 결제 정보를 표시합니다.
  2. 서버는이 정보의 형식이 올바른지 확인합니다. 예 : 신용 카드에 적절한 자릿수가 있고 청구서 수신 주소가 입력되었습니다.
  3. 서버가 숨겨진 양식으로 제출 된 모든 정보를 다시 작성합니다 입력 필드 여기에는 청구 지 주소, 배송 주소 및 신용 카드 정보가 포함됩니다.
  4. 검토 페이지의 양식 (숨겨진 입력 필드 포함)에는 "주문 완료"/ "주문 완료"버튼이 있습니다. 이 검토 양식은 주문 주문 스크립트에 게시됩니다.
  5. finalize 스크립트는 데이터베이스에 청구/배송 정보를 저장하고 신용 카드 정보를 지불 게이트웨이에 제출합니다.

    1. 당신은 신용 정보를 저장할 때 필요한 추가 PCI 준수의 오버 헤드 비용을 절감 :

    이 방법의 장점은 두 가지입니다.

  6. 이 메서드는 SSL 프로토콜의 보안 범위 내에 있습니다. 의미, 암호화 된 신용 카드 정보는 귀하의 서버에 어떤 경우에 제출해야합니다 -이 방법은 지속적으로 신용 카드 데이터의 복잡성을 도입하지 않고 SSL의 효능에 의존하고 있습니다.

이 마지막 사항은 검토 페이지가 있으면 암호화 된 신용 카드 데이터가 네트워크를 통해 전송되는 횟수가 두 배가된다는 또 다른 우려가 제기된다는 것입니다. 이 방법을 사용하면 클라이언트에서 서버로, 서버에서 클라이언트로, 클라이언트에서 서버로 (다시), 서버에서 게이트웨이로 네 가지 전송이 있습니다. 검토없이 최소한 클라이언트에서 서버로, 서버에서 게이트웨이로 두 가지 전송이 있습니다. 추가 전송의 위험이있는 리뷰 페이지의 편의성은 있습니까? 이것이 웹 개발자 (그리고 고객)로서의 결정입니다.

+0

그럴 생각 이었지만 숨겨진 양식의 입력 필드로 다시 쓰기 전에 신용 카드 정보에서 서버 측 암호화를 수행해야합니까? 그렇다면이 방법에 어떻게 접근해야합니까? 디지털 서명 하시겠습니까? – Alex

+2

이 방법을 사용하면 서버의 모든 위치에 cc 정보를 저장하지 않으므로 cc 데이터를 서버로 전송하거나 서버에서 전송할 때 SSL 암호화를 사용할 수 있습니다. – leepowers

+0

숨겨진 양식 입력의 cc 정보를 기술적으로 브라우저에서 캐시하고 사용자 하드 드라이브의 임시 캐시 파일에 저장할 수 있는지 궁금합니다. 어쨌든 이것을 막기 위해? 아마도 임의의 키를 생성하여 세션에 저장 한 다음이 키를 사용하여 숨겨진 양식 필드의 cc 정보를 암호화해야합니다. 검토 페이지가 게시되면 세션 키를 사용하여 값을 해독하고이를 신용 카드 프로세서로 전달할 수 있습니다. – stereoscott

0

동의해야 할 것 같습니다. 신용 카드 번호를 저장하는 것은 너무 큰 위험이며 그 결과는 멀리 가져올 수 있습니다.

이상적인 방법은 정보를 타사 프로세서로 전달하고 반환 된 결과를 사용하여 스크립트 논리를 완성하는 것입니다.

if (transaction){ 
    // code goes here 
} 
else{ 
    // code goes here 
} 

은 (너무 다른 사람이 있습니다) :

1

하나의 대안은 Authorize.net's Customer Information Manager 같은 지불 프로필 서비스를 사용하는 것입니다 ... 당신이 포인트를 얻을 바랍니다. API를 통해 결제 정보를 프로필에 저장 한 다음 카드를 실제로 청구 할 때 프로필 ID를 사용합니다. 이렇게하면 서버에 데이터를 저장하지 않아도됩니다.