我正在尝试将包含HTML数据的表单提交到我的服务器,但它似乎正在剥离它,我似乎无法弄清楚原因。
如果我file_get_contents("php://input")
我可以看到原始形式的内容:
action=submit&content=%3Cp%3EAnteater+Alumni%3A+Help+current+UCI+students+reach+their+goal+of+raising+%2...registration+form%3C%2Fa%3E.%3C%2Fp%3E
但如果我print_r($_POST['content']);
我看到没有任何HTML格式的文本。这就像PHP以某种方式剥离它。
我尝试了以下内容:
$data = file_get_contents("php://input");
$output = array();
parse_str($data, $output);
但这只是输出一个空数组
magic_quotes_gpc
已关闭。我在脚本中没有任何其他内容以任何方式修改内容。
有什么想法吗?
更新:我知道浏览器中显示的是HTML。我正在使用浏览器以及curl
,并将内容转储为text/plain
- 浏览器中的HTML格式不是问题。
答案 0 :(得分:3)
请记住,print_r()
的输出将在浏览器中查看。除非您采取特殊步骤来处理HTML,否则浏览器将看到HTML并将其渲染为HTML。除非您查看页面的来源,否则您将看到的只是文本内容。
要直接查看上传的HTML,您必须先通过htmlentities()
/ htmlspecialchars()
运行它,它会对任何HTML元字符进行编码(例如>
到{{1} })。
同样,除非您特别需要它,否则没有理由从>
检索表单提交数据。这是原始数据,很可能你只是在解析它,PHP已经用_GET / _POST数组为你做了。最重要的是,如果提交包含文件上传,你将把整个文件写入内存,这可能会超出你的脚本的memory_limit并在那里杀死东西。
在I / O流PHP手册页中还有一个note,php://输入只能读取一次。如果您的脚本多次执行,则第二次和后续读取将为空。
答案 1 :(得分:1)
您使用的是框架吗?检查没有事先在数组中迭代,即
foreach ($_POST as $key=>$val)
{
$_POST[$key] = strip_tags($val);
}
还检查你是否没有启用任何已解散的mod_security规则(http://www.modsecurity.org/),这当然取决于你是否使用mod_sec!
尝试这样做
echo '<pre>';
print_r($_REQUEST);
echo '</pre>';
和
foreach ($_POST as $key=>$val)
{
echo $key .' = '. htmlentities($val) . '<br />';
}
只是为了仔细检查你是不是错过了什么:)
编辑:试试这个:
foreach ($_REQUEST as $key=>$val)
{
echo $key .' = '. htmlentities($val) . '<br />';
}