PHP allow_url_include alternative for Wordpress Plugin - php

I'm on a XAMPP for Windows 8.0.3 installation, developing a payments gateway plugin for my ecommerce site made via Wordpress. I moved some of my code to an includes directory, and then used require_once plugins_url('/includes/class-wc-payment-gateway-elavon.php', __FILE__ ); to require the file from my includes directory.
In my website, I'm now receiving a fatal error, telling me "Failed to open stream: no suitable wrapper could be found" on that line that I just mentioned. It also gives me a warning which states "require_once(): https:// wrapper is disabled in the server configuration by allow_url_include=0", which to me means that the method to fix this error would be to change allow_url_include to yes in my php.ini file. To my understanding, it's bad practice to have allow_url_include set to YES in your php.ini file, as it poses security risks. Also, in Wordpress by default, the function "plugins_url" retrieves a URL within the plugins or mu-plugins directory, which is the directory where my plugin resides. Here is a reference to the function in the developer documentation for Wordpress: https://developer.wordpress.org/reference/functions/plugins_url/
So, my questions are as follows. Why is my file failing to be retrieved with this method? Why would it mention that the https:// wrapper is disabled in the server configuration if I'm trying to access a file locally? Is there a better way to require this include than the method that I am using? I'm relatively new to PHP and coding as a whole, so I'd appreciate if you are verbose, or point me to other resources I may use to learn. Thank you for any responses or help.

The reason that your code doesn't work with plugins_url is because that returns a URL such as https://www.example.com/wp-content/plugins/your-plugin/includes/class-wc-payment-gateway-elavon.php which will be executed on the server as PHP and the result of that execution return, not the code itself.
My recommendation is in your main plugin entry file do something like this:
define('MY_AWESOME_PLUGIN_PATH', __DIR__);
Replace that constant name as you see fit.
Then, whenever you need to include something you can just use:
require_once MY_AWESOME_PLUGIN_PATH . '/includes/class-wc-payment-gateway-elavon.php';
In the longer run, if you have more classes you might want to explore using an autoloader instead.

Related

PHP 5.5 -> 5.6: Include not working any more (Codeigniter)

I´m moving an application from a PHP 5.5 server to a PHP 5.6 server. The application is based on Codeigniter 2.2.
On the old server I had something like this in my views to include other template parts:
include('header.php');
This simple and direct include works like a charm on the old server.
On the new server I get the exception, that the file for inclusion could not be found.
I found out, that the PHP preprocessor tries to grab the file from the linux include paths and also from the "system/core" directory. But not from the directory where the view itself is located.
I´ve not idea what makes the difference between these two systems... Has anybody an idea where I can search for the issue?
Check the file path. Whether its inside some other folder or not.
Also can try with
$this->load->view('header.php');
or can load header in Controller as well
As well there are some useful keyword.
APPPATH - Outputs application path. Ex application/
Thanks guys for all your input - I´ve already tried most of these debugging attempts.
Now I digged a little deeper and found the reason for my problems. The short_open_tag directive in PHP caused the issue. Cause this new server had some slight differences in php.ini.
In core/loader.php Codeigniter tries to replace short open tags with normal tags, if the .ini setting for short_open_tags is disabled. For any reason this replacement isn´t working as expected and that caused my issues.
So if anyone has the same issue after moving a Codeigniter installation from one machine to another, that might be a point where you can start.
Thanks to all of you,
Michael

Why PHP Server showing error on include() and required_once() functions?

I am using the php page includes in my site, it's perfectly working without error in localhost, but at the time of running this with a live web server it shows the error.
with using these functions
include("http-url/file.php") and required_once("http-url/file.php")
they are shows error like this
Warning: include(): http:// wrapper is disabled in the server
configuration by allow_url_include=0 in
www.mysite.com/....
with file inclution.........
what to do to solve this issue
Many developers include files by pointing to a remote URL, even if the file is within the local system. For example:
<?php include("http://example.com/includes/example_include.php"); ?>
With allow_url_include disabled, this method does not work. Instead, the file must be included with a local path, and there are three methods of doing this:
By using a relative path, such as ../includes/example_include.php.
By using an absolute path (also known as relative-from-root), such as /home/username/example.com/includes/example_include.php.
By using the PHP environment variable $_SERVER['DOCUMENT_ROOT'], which returns the absolute path to the web root directory. This is by far the best (and most portable) solution. The following example shows the environment variable in action.
Example Include
<?php include($_SERVER['DOCUMENT_ROOT']."/includes/example_include.php"); ?>
More about allow_url_include here

failed to open stream: no suitable wrapper could be found

hello i am implementing php files from one website into another and here is the following error message i am getting when trying to open the following page with implemented php files:
http://www.holidaysavers.ca/europe-destinations-canada.php
basically the php files i am importing from one website into another are identical , however they work on the original website but when i implement them into a new website it does not work anymore.
could you assist me in trying to get this resolved?
thank you
You can't include a PHP script that is on an external website/server into your local script - unless you enable allow_url_include on your php.ini (if you have access to it)
Instead, you can let that website/server render the page and get the resulting html output on your local script.
Replace this line in your script:
include('http://www.holidaysavers.ca/europe-canada.php?detour');
With this:
echo file_get_contents('http://www.holidaysavers.ca/europe-canada.php?detour');
Could you post the code from "europe-destinations-canada.php"? It looks like the script is asking to do stuff that's not configured in your php setup on this new site/server
I don't really know what kind of host you are using or if you are using Xampp, I do have an easy fix to it, for xampp and possibly other web server software. Go to your php.ini file, which you can search for or just look for it in c:\\xampp\php\php.ini, the php.ini should be in the php folder in the server software folder. Now search for allow_url_include in the php.ini file and than replace Off with On, if it isn't already on or something. This is most likely the fix because it worked for me.
I might be able to help further if I know if you are using a hosting or home server. If you are using a hosting website than please share what kind of hosting service you are using so I could inspect it further.
Using as example a random remote php file.
The goal is to use this remote file locally, make sure it hasn't change or be altered. The remote file will be downloaded one time only.
Hard coding the sha256 signature avoid to use the network on startup. This is just a base that can be turned to many scenarios, like checking for updates, depending your needs.
<?php
$lib_url = "https://raw.githubusercontent.com/getopt-php/getopt-php/master/src/CommandInterface.php";
$lib_filename = basename($lib_url);
// SHA256 signature
$lib_signature = hash_file("sha256",$lib_url); // "dba0b3fe70b52adbb8376be6a256d2cc371b2fe49ef35f0c6e15cd6d60c319dd"
// Hardcode the signature to avoid a network call on startup:
//$lib_signature = "dba0b3fe70b52adbb8376be6a256d2cc371b2fe49ef35f0c6e15cd6d60c319dd";
if (!is_file($lib_filename) || $lib_signature != hash_file("sha256",$lib_filename)){
// No local copy found, or file signature invalid, get a copy
copy($lib_url, $lib_filename);
}
require $lib_filename;
It is very useful if you intent to share a program as a single file, without composer.
For the case of a file hosted on Github, an ETag HTTP header is provided, it can be used to avoid to download the whole file.
php -r 'var_dump(json_decode(get_headers("https://raw.githubusercontent.com/getopt-php/getopt-php/master/src/CommandInterface.php", 1)["ETag"]));'
//string(64) "c0153dbd04652cc11cddb0876c5abcc9950cac7378960223cbbe6cf4833a0d6b"
The ETag HTTP response header is an identifier for a specific version
of a resource. It lets caches be more efficient and save bandwidth, as
a web server does not need to resend a full response if the content
has not changed.
Warning: include() [function.include]: URL file-access is disabled in the server configuration in /home/content/91/8151691/html/HolidaySavers.ca/europe-destinations-canada.php on line 52
says it all. I believe this is called XXS. It appears you're attempting to include a URL based file which is denied in your server configuration which is either one of two things.
You're attempting to include the file on site B from site A which you would then use instead of include('WhateverFile'); file_get_contents('WhateverFile'); however this will only return the client side data as it is an HTTP request;
You've duplicated the file on site B and forgot to update the domain configuration. Be sure that the include path reflects the site you're running the script on ie.
include(dir($_SERVER['SCRIPT_FILENAME']) . DIRECTORY_SEPARATOR . 'WhateverFile.php');
In any case. I would have to actually examine the line 52 on the said file to see why PHP is complaining to you in detail lol

PHP Fatal error: Call to undefined method after uploading on the web

I have some pages, which work fine locally(using WAMP and error_reporting E_ALL in php.ini), but once I upload them, I get the following error:
Fatal error: Call to undefined method DB::exists()
The method is there, and I don't know why it can't be seen.
Do you have an idea what went wrong?
Try putting a debug statement into the file that defines class DB and DB::exists(), such as:
echo "DB file was included\n";
Does that message appear? If not, then the file isn't being included, which explains why the method isn't found.
Find the the location where that file is supposed to be getting included, and examine the include path at the point:
echo "Include path is: " . get_include_path() . "\n";
Does another file with the same name exist in one of the other directories listed in the include path? If so, you might need to alter the other of the entries in your include path (which is defined by include_path in php.ini, but can also be edited at runtime with set_include_path())
The server has Pear::DB installed (http://pear.php.net/package/DB/redirected). Your autoload function is loading Pear's DB class instead of yours.
If you have control over the server, something like this should work
$ sudo pear uninstall DB
If you don't have control over the server, you'll need to rename your DB class to something else...
You could modify the include_path to load PEAR classes after your own classes, but that could lead to other naming conflicts.
No, the method isn't there. The sooner you learn to trust to the error messages, the sooner you get your application to work.
You have probably installed pear and some libraries in other place than your website code.
Check where points you includes in php.ini and upload that too.
You probably want to check the webserver's php.ini configuration against your local php.ini to see if there is any modules not loaded on the webserver which may be required in your PHP application.
Also, check the version numbers of PHP on your webserver and local PHP as well as checking up the web for limitations of your PHP version.

Need to Bulletproof this PHP include. Getting Failed to Open Stream

I've got some functions in my file that require taxonomy.php to execute. I'm attempting to include the file like so...(this is called from functions.php, which is located in wp_content/themes/mytheme/
include($_SERVER['DOCUMENT_ROOT'] .'/wp-admin/includes/taxonomy.php');
However, depending on the particular server setup, its hit or miss (mostly hit) whether the include will be found. In the case its not found, I get this error...
Warning: include(/home/user/domainname.com/wp-admin/includes/taxonomy.php) [function.include]: failed to open stream: No such file or directory in /home/user/domainname.com/testing123/wp-content/themes/mytheme/functions.php on line 10
UPDATE: Assuming I'm already doing about as much as I can by using DOCUMENT_ROOT, is there a means of avoiding the error that occurs when the file is not found? And I will be checking for function_exists in any functions that require taxonomy.php so as to suppress errors...
Well, the only way to bulletproof this is to actually configure it on each server you deploy it on. If you can't assume document_root is a reliable factor, I can't imagine any other variable that could give you a better result.
You could start searching for taxonomy.php but that is expensive, and horribly prone to failure or picking the wrong file (what happens if my neighbor has wordpress installed in /home/user/domainname2.com?
If your application depends on a particular file, you should be using require/require_once to ensure your application does not partially load despite missing the required file.
As for making sure that file always exists and is in a place you need it, you could move that to a configuration file and allow the user running the software to set it, along with auto-attempting to find the find in the event the user is clueless.

Categories