我使用IPN实现了一个动态按钮“立即购买”(未保存在我的PayPal帐户中)并且工作正常(是的!)。
现在我对他的安全性有疑问,因为如果有人用萤火虫(例如)更改了金额值,那么如果我的IPN听众说数量存在问题,那么交易对于paypal也是有效的。
我的问题是“我可以使用php / codeigniter库加密表单吗?”
因为我试图在IPN监听器中检查金额,但是paypal上的交易继续正确并且没有阻止IPN。
在这里,您可以找到我的侦听器代码的一部分:
private function isVerifiedIPN(){
$req = 'cmd=_notify-validate';
$posts = $this->input->post();
foreach ($posts as $key => $value){
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
if($this->config->item('SIMULATION'))
$url = $this->config->item('SIMULATION_URL');
else
$url = $this->config->item('PRODUCTION_URL');
if(!$this->isVerifiedAmmount() ||
!$this->isPrimaryPayPalEmail() ||
!$this->isNotProcessed()){
$req = '';
}
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Host: $url\r\n"; //443
$header .= "Content-type: application/x-www-form-urlencoded\r\n";
$header .= "Content-length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ("ssl://$url", 443, $errno, $errstr, 30);
if (!$fp)
{
$this->sendReport("Errore connessione socket");
return FALSE;
}
else
{
fputs ($fp, $header . $req);
while (!feof($fp))
{
$res = fgets ($fp, 1024);
if (strcmp($res, "VERIFIED") == 0)
{
// transizione valida
fclose ($fp);
return TRUE;
}
else if (strcmp ($res, "INVALID") == 0)
{
$this->sendReport('Transizione non valida');
fclose ($fp);
return FALSE;
}
}
}
}
答案 0 :(得分:0)
您可以动态加密按钮,以便使用Firebug(或类似软件)的人无法编辑它们。 PayPal API库有一个您可以使用的示例,但我现在无法再找到它。
This PayPal help file解释了如何使用服务器命令行获取所需的各种密钥。
我还发现了a tutorial和a certificate builder(我没有使用,因此无法确认它有多安全......)
生成密钥和证书后,您需要将它们放在服务器上,并将DEFAULT_EWP_PRIVATE_KEY_PATH
和DEFAULT_EWP_CERT_PATH
设置为相关文件。
将公共证书上传到PayPal(链接教程中的说明),并将DEFAULT_CERT_ID
设置为它为该文件提供的证书ID。它还会为您提供一个可以下载的文件 - 将其添加到您的服务器并将PAYPAL_CERT_PATH
设置为该文件的路径。
答案 1 :(得分:0)
对于那些发现使用库来加密加密或者让托管需求出现问题的人来说,另一个技巧是不加密,而是创建一个你传递的哈希,以便你可以检测到篡改,然后在IPN进入处理时验证此哈希。我在这里解释一下:
How do I make a PayPal encrypted buy now button with custom fields?