首页 > 解决方案 > 通过 URL 在 PHP 中调用 POST 函数

问题描述

我的页面中包含一个 POST 函数。我试图直接为我的 CURL 函数调用它,请注意在下面的代码中 url 变量设置为http://dirtrif.loc/installs.php

//extract data from the post
//set POST variables

$cookie_name = "drcuserid";

if(isset($_COOKIE[$cookie_name]))
{
  $cookie = $_COOKIE[$cookie_name];
}
$url = 'http://dirtrif.loc/installs.php';
$fields['username'] = $vbulletin->userinfo[username];
$fields['webmasteremail'] = $vbulletin->options[webmasteremail];
$fields['cookie'] = $_COOKIE[$cookie_name];

//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);


echo $fields_string;

当执行 CURL 脚本时,通过导航到实际页面而不运行它应该运行的部分,这会导致问题。

我目前在我的 installs.php 中设置了如下的帖子部分:

if (isset($_POST['username'])) {
  $vbulletin->db->query_write("
  INSERT INTO " . TABLE_PREFIX . "installs (
    username,
    webmasteremail,
    cookie
  ) VALUES (" .
    $_POST['username'] .", '" .
    $_POST['webmasteremail'] . ", '" .
    $_POST['cookie'] . "'
  )");
}

有没有办法可以更改我的 CURL 代码中的 URL 以直接指向 installs.php 页面的那部分?

installs.php 的全部内容(注意*自发布此问题以来我做了一些更改)

<?php
// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);

// #################### DEFINE IMPORTANT CONSTANTS #######################
define('THIS_SCRIPT', 'installs');
define('CSRF_PROTECTION', true);
define('CSRF_SKIP_LIST', '');

// ################### PRE-CACHE TEMPLATES AND DATA ######################

// pre-cache templates used by all actions
$globaltemplates = array(
  'installs'
);

// pre-cache templates used by specific actions
$actiontemplates = array();

// ######################### REQUIRE BACK-END ############################
require_once('./global.php');

// ######################### VARIABLES ############################

$username       = $_POST['username'];
$userid         = $_POST['userid'];
$email          = $_POST['email'];
$addontitle     = $_POST['addontitle'];
$addonversion   = $_POST['addonversion'];
$bburl          = $_POST['bburl'];
$bbtitle        = $_POST['bbtitle'];
$webmasteremail = $_POST['webmasteremail'];
$cookie         = $_POST['cookie'];

    if (isset($_POST['username'])) {
      $db->query_write("
      INSERT INTO " . TABLE_PREFIX . "installs (
        username,userid,email,addontitle,addonversion,bburl,bbtitle,webmasteremail,cookie,dateline
      ) VALUES (
        '$username',
        '$userid',
        '$email',
        '$addontitle',
        '$addonversion',
        '$bburl',
        '$bbtitle',
        '$webmasteremail',
        '$cookie',
        NOW()
      )");
    }

// #######################################################################
// ######################## START MAIN SCRIPT ############################
// #######################################################################

$navbits = array();
$navbits[$parent] = 'Installs Page';
$navbits = construct_navbits($navbits);

eval('$navbar = "' . fetch_template('navbar') . '";');
eval('print_output("' . fetch_template('installs') . '");');
?>

标签: phpfunctioncurlpost

解决方案


有没有办法可以更改我的 CURL 代码中的 URL 以直接指向 installs.php 页面的那部分?

至于标准 HTTP 功能:不,没有明确的方式来调用脚本的各个部分。

让我们从头开始。在这种情况下,我们通常会在 URL 中设置文件的路径,该文件包含我们要执行的部分。然后,由我们来决定,我们如何设计我们的程序来知道,应该执行哪个部分。我们可以像您尝试的那样使用 POST 参数。到目前为止,一切都很好。

现在,我们如何将脚本(在您的情况下为 installs.php)分成几部分?

一种好方法是已经提到的 RamRaider:使用 POST 参数action并在 installs.php 中,将代码放入一个大的switch. 例子:

// installs.php
<?php
switch ($_POST['action']) {
  case 'myfirstaction':
    if (isset($_POST['username'])) {
      $vbulletin->db->query_write("...");
    }
    break;
  case 'myotheraction':
    // code here
    break;
}
?>
To call specific actions, just extend you $fields array:
<?php
// script that "can be executed from anywhere":
$fields['action'] = 'myfirstaction';
?>

我会说这是在您的情况下最干净的方法。但是,如果 installs.php 是您正在调整的更大的脚本,这可能是太多的工作。在这种情况下,您可能希望在运行代码后退出脚本(因此,只运行您想要的代码)。您可以简单地编写exit;并且不会执行进一步的代码。见:https ://www.php.net/exit 。


推荐阅读