【发布时间】:2018-09-10 07:54:49
【问题描述】:
我有这个 php 文件 graph.php
$host = $_POST['hostname'];
echo $type=$_POST['type_char'];
include('rrdtools.inc.php');
include('graphs/'.$type.'.inc.php');
我尝试使用这个 ajax 代码向这个文件发送数据
var type_char='fortigate_cpu';//$('#graph').val();
var hostname='10.10.0.144';//$(this).attr('id');
//$('#device_host').val(id);
$.ajax({
type: 'POST',
url: 'SNMP/graph.php',
data: { hostname:hostname,type_char:type_char },
success: function(data) {
alert(data);
// show the response
$("#grph").attr("src", 'SNMP/graph.php');
console.log(data);
}
});
我将数据发送到该文件时的结果是
fortigate_cpu 作为 type_char 变量的值 当我在 apache 日志中打开 error.log 文件时 我有这个消息
include(): 未能打开 'graphs/.inc.php' 以包含 (include_path='.:/usr/share/php')
正如您所见,即使 char_type 变量由 ajax 发送并打印在页面中,包含函数中也不包含 fortigate 的值 包含文件必须是这样的
include( 'graphs/fortigate_cpu.inc.php')
即使变量是从 ajax 接收到的,为什么 type 不包含在包含会话中
【问题讨论】:
-
1.这个ajax是如何被解雇的? 2. 是否访问了正确的 URL
SNMP/graph.php?3。您是否检查了浏览器控制台,没有像URL NOT FOUND?4 这样的错误。尝试先在 php 页面上打印POST数据以查看数据是否到来? -
网址是正确的,如您所见,我可以打印 ajax 变量 $type 的结果,但是当我尝试包含文件 ('graphs/'.$type.'inc.php') 时,结果即使 echo $type 的结果,在日志文件中也找不到文件(graphs/inc.php);是'fortigate _cpu',即php可以从ajaax接收值
-
所以可能在 include('rrdtools.inc.php');变量设置为空?
-
从安全的角度来看,这样做并不是一个好主意。您可能允许攻击者执行任意代码。无论如何,您可以使用输入变量来帮助决定执行哪些代码,但我真的不会让它直接指定要使用的文件的名称。它在自找麻烦 IMO
-
关于这个问题,您的代码看起来应该可以工作。所以我会说要么a)回发实际上不是由ajax引起的(例如,可能同时发生提交到同一个脚本的表单-我们不知道你是如何触发你的ajax的),或者b)$ type 变量与 rrdtools.inc.php 中另一个同名的全局变量冲突,并且在该脚本中再次设置为空。我们又看不到了。但是看看代码,我能想到的只有两件事可能会导致它。
标签: javascript php ajax