0

我有两个 Python 文件,我想阻止任何人执行,除非它来自服务器本身。这些文件实现了增加用户金额的功能。我需要的是让这个文件不对网络公开,这样如果有人试图调用这个文件,文件就会拒绝这个请求,除非调用来自服务器。

有谁知道我该怎么做?我的第一个想法是检查 IP 地址,但很多人可以欺骗他们的 IP。

例子

假设我有这个文件:function.py,这个文件中的一个函数将接受一个新的金额并增加数据库中的适当余额。

当有人试图将数据发布到这个文件,并且这个人在服务器之外(比如说 from 244.23.23.0),这个文件将是不可访问的。而从服务器本身调用该函数将被接受。

所以文件可以访问服务器上的其他文件,但外部用户不能,结果除非从服务器调用,否则没有人可以执行这个文件。

这对我来说真的很重要,因为它与真钱有关。此外,这笔钱将来自 PayPal IPN。实际上,如果有一种方法可以阻止访问,除非它来自 PayPal,那将是保护应用程序的绝佳方式。

好的,就我所尝试的而言:

  1. 使用 Google [https://developers.google.com/cloud-sql/] 将数据库放在云 SQL 中
  2. 尝试在文件中检查传入请求的 IP

感谢您的任何帮助。

4

5 回答 5

1

如果您使用 Apache,则可以使用 .htaccess 来限制对文件的访问:

http://httpd.apache.org/docs/current/howto/htaccess.html

于 2013-03-13T09:24:18.387 回答
0

.htaccess、chmod 或者您可以使用您自己定义的密钥...您有多种可能性。

编辑:无论如何,如果文件只包含一个函数。除非您在此文件中实际调用它,否则没有人可以从外部 http 请求中使用它:function();

于 2013-03-13T09:23:17.967 回答
0

关于支付宝..

我建议从 paypal 看一下这个例子,它们是 x.com 的一部分,它是合法的。

重要的部分是:

// STEP 2: Post IPN data back to paypal to validate

$ch = curl_init('https://www.paypal.com/cgi-bin/webscr');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));

// In wamp like environments that do not come bundled with root authority certificates,
// please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path 
// of the certificate as shown below.
// curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
if( !($res = curl_exec($ch)) ) {
    // error_log("Got " . curl_error($ch) . " when processing IPN data");
    curl_close($ch);
    exit;
}
curl_close($ch);


// STEP 3: Inspect IPN validation result and act accordingly

if (strcmp ($res, "VERIFIED") == 0) {
    // check whether the payment_status is Completed
    // check that txn_id has not been previously processed
    // check that receiver_email is your Primary PayPal email
    // check that payment_amount/payment_currency are correct
    // process payment

    // assign posted variables to local variables
    $item_name = $_POST['item_name'];
    $item_number = $_POST['item_number'];
    $payment_status = $_POST['payment_status'];
    $payment_amount = $_POST['mc_gross'];
    $payment_currency = $_POST['mc_currency'];
    $txn_id = $_POST['txn_id'];
    $receiver_email = $_POST['receiver_email'];
    $payer_email = $_POST['payer_email'];
} else if (strcmp ($res, "INVALID") == 0) {
    // log for manual investigation
}

这里发生的是发布到您的 ipn 脚本的请求被发送回贝宝进行验证,贝宝检查详细信息并发送回“有效”响应,此时您知道数据是好的并且已由贝宝发送,您是然后,您可以对数据采取行动并更新数据库或您需要执行的任何操作。

于 2013-03-13T09:29:13.433 回答
0

您可以尝试以下方法:

将其移出public_html文件夹。

if (php_sapi_name() == 'cli')
{
   //code to be executed
}
else if (php_sapi_name() != 'cli')
{
   die();
}

这样,文件将只能从命令行执行,也可以从您的服务器本身执行,因为您必须验证服务器详细信息。该文件无法从 Web 执行。

于 2013-03-13T09:31:55.393 回答
0

另一种不太优雅的方法可能是定义一个需要和秘密的参数以能够执行代码。

例如:

www.myweb.com/myfunction.php?pass=secretPassword

然后您可以检查密码是否是您期望的密码,例如:

//hardcoded hashed pass with sha1, for example.
$myHashedPass = '40bd001563085fc35165329ea1ff5c5ecbdbbeef';

if(sha1($_GET['pass']) != $myHashedPass){
    die();
}

可能不是最好的解决方案,但与其他一些解决方案结合使用会很有用。

于 2013-03-13T09:39:49.823 回答