2010-03-28 45 views
7

Làm thế nào để bạn chuyển thông tin thẻ tín dụng an toàn giữa các trang trong PHP? Tôi đang xây dựng một ứng dụng thương mại điện tử và tôi muốn có những người sử dụng phải trải qua kiểm tra như thế này:Làm cách nào để chuyển an toàn thông tin thẻ tín dụng giữa các trang trong PHP

Nhập thông tin -> Review -> Finalize tự

Vấn đề là tôi không chắc chắn về cách an toàn chuyển thông tin tín dụng từ khi người dùng nhập chúng vào khi tôi xử lý thông tin đó (ở bước Hoàn tất đơn đặt hàng). Tôi nghe nói sử dụng phiên là không an toàn, ngay cả với mã hóa.

Mọi trợ giúp sẽ được đánh giá cao!

+1

Đây chỉ là một ý tưởng tồi. Bạn sẽ phải xử lý rủi ro tăng lên vì không có lợi ích thực sự. Cổng thanh toán có thể xác nhận số thẻ tín dụng anyway, dữ liệu phiên được mở để tấn công và hiển thị số CC trên màn hình có thể có nghĩa là chúng được lưu trữ ở đâu đó. – Rimian

+0

Kết hợp thông tin xác nhận và thanh toán trên cùng một trang. –

Trả lời

1

Trước hết, bạn nên sử dụng giao thức HTTPS để đảm bảo kết nối được mã hóa.

Sau đó, bạn có thể lưu trữ dữ liệu trong $_SESSION siêu toàn cầu. Dữ liệu được lưu trữ trên máy chủ của bạn, vì vậy nó tương đối an toàn.

Bạn có thể thực hiện một kỹ thuật tương tự nơi bạn chèn thông tin vào cơ sở dữ liệu Đặt hàng, trong đó khóa là một GUID hoặc một cái gì đó khác khá ngẫu nhiên và độc đáo. Sau đó, khi người đi để sửa đổi/xem xét thứ tự của chúng, bạn nên có ID đặt hàng được lưu trữ ở phần GET của URL (hoặc nếu bạn đang hoang tưởng, một cookie/session biến):

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

Để cung cấp bảo mật bổ sung, bạn cũng có thể lưu trữ Địa chỉ IP trong Bảng đơn hàng và đảm bảo IP và ID đơn đặt hàng khớp nhau.

+0

Tôi đang cố gắng không lưu trữ thông tin trên máy chủ của mình nếu có thể – Alex

+2

@Alex trang xác nhận được yêu cầu từ máy chủ. Bạn sẽ lưu trữ ở đâu khác? Phía khách hàng? – Rimian

+8

Đây là sự vi phạm PCI-DSS vì $ _SESSION sẽ ghi dữ liệu vào ổ đĩa cứng trong văn bản thuần túy. – rook

0

Không phải khu vực chuyên môn của tôi, nhưng tôi nghĩ bạn muốn lưu trữ nó trong một phiên nhưng cũng sử dụng "mã thông báo đồng bộ" (hoặc bất kỳ trẻ nào đang gọi nó vào những ngày này) để giúp tránh các cuộc tấn công CSRF.

Tất nhiên, bạn muốn được sử dụng https (chính xác), tránh dữ liệu nhạy cảm trong URL và các lĩnh vực ẩn, tránh đưa thông tin rất nhạy cảm trong bất kỳ phản ứng nào cả, vv, vv

10

tôi wouldn' t lưu trữ nó bất cứ nơi nào. Đó là quá nhiều rủi ro và có lẽ không mang tính đạo đức.

Gửi yêu cầu đến cổng thanh toán bằng cách đăng biểu mẫu qua https và chỉ lưu trữ kết quả của giao dịch.

Bạn có thể chỉ quan tâm nếu giao dịch được chấp thuận hoặc bị từ chối. Ai quan tâm số đó là gì?

+0

Tôi muốn đồng ý với điểm được nêu ở đây, nếu bạn đang cố gắng không lưu trữ thông tin thẻ (đó không phải là một ý tưởng tồi), bất kỳ tập lệnh PHP nào bạn sử dụng để xử lý biểu mẫu gửi thông tin thanh toán chỉ cần chuyển tiếp thông tin trên cổng thanh toán hoặc bất cứ nơi nào cần đến. Điều này có nghĩa là thông tin thẻ tín dụng cần phải là điều cuối cùng bạn yêu cầu như là một phần của quy trình thanh toán. –

+1

+1, điểm chung của nó để xem lại thứ tự _before_ nhập thông tin CC. Logic kinh doanh ở đây chỉ là ngược. –

+2

Trên thực tế, nhiều trang web (bao gồm amazon, newegg) có trang đánh giá/xác nhận sau khi bạn nhập thông tin của mình để đảm bảo bạn đặt thông tin vận chuyển/thanh toán CORRECT – Alex

8

Không lưu trữ thông tin thẻ tín dụng trong phiên, không lưu trữ thông tin vào cơ sở dữ liệu, không lưu trữ nó vào tệp. Thay vào đó, hãy viết thông tin cc trở lại trang đánh giá trong đầu vào html ẩn.

Vì vậy, dòng chảy chương trình sẽ làm việc như thế này:

  1. tài bài gửi thanh toán và thông tin thanh toán đến máy chủ thông qua một hình thức html.
  2. Máy chủ xác minh rằng thông tin này có định dạng đúng (ví dụ: thẻ tín dụng có số chữ số thích hợp, địa chỉ thanh toán được nhập, v.v.)
  3. Sau khi xác minh, máy chủ ghi lại tất cả thông tin được gửi dưới dạng biểu mẫu ẩn các trường nhập. Điều này bao gồm địa chỉ thanh toán, địa chỉ giao hàng và thông tin thẻ tín dụng.
  4. Biểu mẫu trên trang đánh giá (có các trường nhập ẩn) có nút có nhãn "Kết thúc đơn đặt hàng"/"Toàn bộ đơn đặt hàng". Mẫu đánh giá này đăng lên kịch bản lệnh hoàn chỉnh.
  5. Tập lệnh cuối cùng lưu trữ thông tin thanh toán/giao hàng trong cơ sở dữ liệu của bạn và gửi thông tin thẻ tín dụng đến cổng thanh toán của bạn.

Những lợi thế của phương pháp này là hai lần:

  1. Bạn tiết kiệm chi phí và chi phí tuân thủ PCI bổ sung là cần thiết khi lưu trữ thông tin tín dụng.
  2. Phương pháp này nằm trong giới hạn bảo mật của giao thức SSL. Có nghĩa là, thông tin thẻ tín dụng được mã hóa sẽ phải được gửi đến máy chủ của bạn trong bất kỳ trường hợp nào - phương pháp này tiếp tục chỉ dựa vào hiệu quả của SSL, mà không giới thiệu sự phức tạp của dữ liệu thẻ tín dụng.

Điểm cuối cùng này làm tăng thêm mối quan ngại - bằng cách xem trang bạn đang nhân đôi số lần dữ liệu thẻ tín dụng được mã hóa đang được truyền qua mạng. Với phương pháp này có 4 truyền tối thiểu: máy khách đến máy chủ, máy chủ cho khách hàng, máy khách đến máy chủ (một lần nữa) sau đó máy chủ đến cổng. Nếu không có đánh giá có 2 truyền tối thiểu: máy khách đến máy chủ và máy chủ đến cổng. Sự tiện lợi của một trang đánh giá có đáng rủi ro về việc truyền tải thêm không? Đó là quyết định bạn là nhà phát triển web (và khách hàng của bạn) có thể thực hiện.

+0

Tôi đã nghĩ rằng, nhưng tôi nên làm một số loại mã hóa phía máy chủ trên thông tin thẻ tín dụng trước khi tôi viết chúng trở lại dưới dạng trường nhập biểu mẫu ẩn? Nếu vậy, tôi nên tiếp cận phương pháp này như thế nào? Digtally ký nó? – Alex

+2

Với phương pháp này, bạn sẽ không lưu trữ thông tin cc ở bất cứ đâu trên máy chủ, vì vậy bạn sẽ có thể dựa vào mã hóa SSL để truyền dữ liệu cc đến/từ máy chủ. – leepowers

+0

Tôi rất tò mò nếu có thông tin cc trong đầu vào biểu mẫu ẩn có thể được lưu trữ kỹ thuật bởi trình duyệt và được lưu trữ trong tệp bộ đệm tạm thời trên ổ cứng của người dùng. Dù sao để ngăn chặn điều này? Có lẽ một nên tạo ra một khóa ngẫu nhiên và lưu trữ trong phiên, và sau đó sử dụng khóa đó để mã hóa thông tin cc trong trường biểu mẫu ẩn. Khi trang đánh giá được đăng, người dùng có thể sử dụng khóa phiên để giải mã giá trị và chuyển cho bộ xử lý thẻ tín dụng ... – stereoscott

0

Tôi nghĩ tôi sẽ phải đồng ý. Lưu trữ số thẻ tín dụng là một rủi ro quá lớn và hậu quả có thể được tìm nạp nhiều.

Cách lý tưởng là chuyển thông tin tới bộ xử lý của bên thứ ba và chỉ sử dụng kết quả được trả lại để tạo logic lôgic của bạn.

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

Hy vọng bạn sẽ có được điểm ... :)

1

Một thay thế là sử dụng một dịch vụ hồ sơ thanh toán như Authorize.net's Customer Information Manager (có những người khác quá). Bạn lưu trữ thông tin thanh toán trong tiểu sử qua API của họ, sau đó sử dụng ID tiểu sử khi thực sự tính phí thẻ. Bằng cách này, bạn sẽ không bao giờ lưu trữ dữ liệu trên máy chủ của mình.

Các vấn đề liên quan