这是我的ipn-security-ckeck的第四部分。 我需要你检查一下它是否安全:
// Check number4 ---------------------------------------------------------
$product_id_string = $_POST['custom'];
$product_id_string = rtrim($product_id_string, ","); // remove last comma
// Explode string, make it an array; check payment !
$id_values = array();
$id_str_array = explode(",", $product_id_string);
$fullAmount = 0;
foreach ($id_str_array as $key => $value) {
$id_quantity_pair = explode("-", $value);
$product_id = $id_quantity_pair[0]; // Get the product ID
$product_quantity = $id_quantity_pair[1]; // Get the quantity
if (1 != intval($product_quantity)) {
// Somebody is manipulating the item´s quantity
$message = "Somebody is manipulating the item´s quantity";
mail("me@myemail.de", "Quantity Hack", $message, "From: me@myemail.de" );
exit()
}
// remember item´s ID
$id_values[$key] = intval($product_id);
}
$sql = 'SELECT price FROM products WHERE id IN ('.implode(',', $id_values).')';
while($row = mysql_fetch_array($sql)) {
$fullAmount += $row["price"];
}
$fullAmount = number_format($fullAmount, 2);
if (isset($_POST['mc_gross'])) {
$grossAmount = $_POST['mc_gross'];
} else
$grossAmount = 0;
$message = "grossAmount wurde = 0 gesetzt";
mail("me@myemail.de", "grossAmout Hack", $message, "From: my@myemail.de" );
exit();
if ( intval($fullAmount * 100) != intval($grossAmount *100) ) {
$message = "Possible Price Jack: " . $_POST['payment_gross'] . " != $fullAmount \n\n\n$req";
mail("me@myemail.de", "Price Jack or Bad Programming", $message, "From: me@myemail.de" );
exit(); // exit script
}
这是否能成为击败顶价的好脚本? 我该改变什么吗? 如果有,那是什么? 问候和感谢
答案 0 :(得分:1)
价格只应在服务器上计算。你为什么允许客户提交价格?允许客户提交价格允许他们尝试更改您的价格。其次,如果它与您在服务器上计算的内容不一致,那么无论如何都要扔掉它。只需在服务器上计算它,不接受客户提交的任何价格。
看起来除了1之外的任何数量都被视为黑客攻击,为什么?
使用
将产品ID转换为字符串$id_values[$key] = intval($product_id);
如果客户端提交非整数值,那么我认为这将返回0.如果您的产品ID为0,则可能会导致问题。