【问题标题】:Calling a POST function within PHP via URL通过 URL 在 PHP 中调用 POST 函数
【发布时间】:2020-06-07 07:55:29
【问题描述】:

我的页面中包含一个 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') . '");');
?>

【问题讨论】:

  • 上面代码的最后一部分——是来自installs.php的sn-p吗?上面的代码也只是一个摘录?您能否澄清一下:您想使用 cURL 向installs.php 发送 POST 请求,但只执行该页面上的部分代码?如果您要添加所有installs.php,这将有助于确定可以做什么
  • @RamRaider 是的,底部代码来自 installs.php,顶部代码通过可以在任何地方执行的安装脚本调用。 installs.php 内部只是更多的 php/html
  • 您的问题有点模糊 - 但您可以在安装脚本中设置可定位的部分 - 例如,在 POST 字段中包含字段 action 并在安装中使用 switch 语句- 如switch($_POST['action']){ case 'install':/* code*/break; case 'uninstall':break; }
  • 怎么含糊?我想通过url调用我所说的部分,我只是不知道该怎么做,例如:dirtrif.loc/installs.php?post我的网址@RamRaider
  • 您的代码容易受到 SQL 注入的影响!

标签: php function curl post


【解决方案1】:

有没有办法可以更改我的 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

【讨论】:

  • 该页面还相当简单,我将更新 OP 以包含所有内容。谢谢你为我分解它,虽然很好的解释。我对此的唯一问题是,如果我要使用开关,我将如何导航调用该部分 IE。 mysite.com/installs.php?SomethingLikeThis
  • 你在 curl 请求中使用的 url 可以包含一个查询字符串,所以如果你有一个 http://dirtrif.com/installs.php?action=install&amp;name=bob 的 url 例如你可以使用 switch( $_GET['action'] ){/* cases */} 而不是 switch( $_POST['action'] ){/* cases */}
  • 我已将完整的 installs.php 内容添加到 OP,我不确定这是否是解决此问题的方法,因为我放在那里的 url 永远不会被指定为一件事。再分解一下,installs.php 在我的服务器上,CURL 代码是我给你安装的,当你安装它时,它会给我我要求的信息。
  • 请解释url i put there will never be designated as one thing 的实际含义。另外 - 您是说您将curl 代码发送给客户,然后他们将其放在他们的服务器上并运行它?
  • @RamRaider 是的!确切地说,然后它将数据存储到我的数据库中,安装跟踪器之类的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多