2011-09-29 9 views
0

결제 게이트웨이 (신용 카드 등)를 결제 게이트웨이에 제출하면 결제가 승인되면 "response_code"1이 전송됩니다. 다음 코드를 사용하여 승인 된 트랜잭션을 반영하도록 데이터베이스의 사용자 정보를 업데이트합니다.데이터베이스를 업데이트하는 중 오류가 발생했습니다. PHP

그러나 약 10 회마다 약 1 회의 트랜잭션이 승인 된 응답을 반환했지만 사용자 정보는 업데이트되지 않습니다. 이 코드가 잘못된 것이 있습니까? 아니면 어떤 이유로 response_code가 1과 같지 않을 수 있습니까?

<?php 
session_start(); 
if ($_GET['response_code'] == 1) 
{ 
require('scripts/global.php'); //connect to database 
$email = $_SESSION['email']; 
$level = 3; 
$transaction_id = "" . htmlentities($_GET['transaction_id']); 
mysql_query ("UPDATE `users` SET level = '$level', trans_id = '$transaction_id' WHERE `email` = '$email'"); //update user info 
$error = "false"; 
} 
else 
{ 
$noerror = "true"; 
$message = "Sorry, an error occurred: " . htmlentities($_GET['response_reason_text']); 
} 
?> 
+1

'? response_code = 1'을 설정하지 못하게하려면 어떻게해야합니까? 또한 SQL 주입 공격을받을 수도 있습니다. – Shef

답변

2

아마 세션 시간 초과가 있었기 때문에? WHERE이 전자 메일 주소를 사용합니다. 유효하지 않은 경우 전자 메일 주소를 사용하면 업데이트가 제공되지 않습니다.

아마도 거래 ID (또는 이와 유사한 것)를 확인해야합니다. 거래가 시작되기 전에 그런 거 같아?

편집 : 오류가 발생하면 저장하고 필요한 변수도 저장하십시오. 이렇게하면 문제를 쉽게 찾아 낼 수 있습니다. 예를 들어 로그 파일을 사용하십시오.

0

명백한 보안 허점 이상으로 쿼리 결과를 확인하지 않습니다. 무엇이 업데이트되었는지 확인하려면 mysql_error()mysql_affected_rows()을 사용해보세요. 둘 중 하나가 비정상적인 것을 나타내면 실행 된 쿼리의 정확한 텍스트를보고 싶을 것입니다. 확인할 사항 :

  • $email이 비 었습니까?
  • $transaction_id 또는 $email에 아포스트로피가 있습니까?
  • 데이터베이스에 중복 된 이메일 주소가 있습니까?
  • 사용자가 이미 레벨 3으로 설정되어 있었습니까?
  • 데이터베이스에 대한 연결이 끊어 졌습니까?
  • 스크립트가 전혀 호출되지 않았습니까?
관련 문제