我编写了一些jQuery + PHP代码,它从网页上的元素中获取HTML并将其保存在服务器上。这是我正在使用的代码:
var page = {
'html': document.querySelector("article").innerHTML,
'url': 'path/current/webpage.php' or (<?php echo "'$current_page'"; ?>)
// Both give same 'url' value. This is not an issue.
};
$.ajax({
url:'https://example.com/update.php',
type:'post',
data: page,
success:function(data){
window.location.reload();
}
});
以下是update.php
的代码:
$content = $_REQUEST['html'];
$page = $_REQUEST['url'];
file_put_contents($page, $content, LOCK_EX);
我对dataType
和contentType
不太满意,所以我最初跳过它们。但是,请求有时会成功,但有时会出现403()
错误。我做了一些研究,发现这可能是由于缺少dataType
和contentType
。所以,我使用了以下值:
contentType: 'text/plain; charset=utf-8',
dataType: 'html'
我不再收到任何错误,但页面实际上并没有更新。我也尝试将值设置为:
contentType:'application/json',
dataType: 'html'
这一次,我没有得到任何403()错误,但页面实际上不会更新。
是否需要根据{app} / json'或contentType
等'text/plain; charset=utf-8'
的值来不同地访问帖子数据?因为即使使用200响应代码,更新似乎也不会显示在网页上。
使用application/x-www-form-urlencoded; charset=UTF-8
更新某些网页但会为其他网页带来403()
错误。
答案 0 :(得分:0)
作为Rory said (和我一样,在我写的答案中,当我看到他的评论时删除了;他的评论是正确的),403响应代码可能不会表示dataType
或contentType
存在问题。您应该查找服务器拒绝满足请求的其他原因。例如,当您发布HTML时,也许您(或您的Web主机)正在进行某种反脚本注入保护。你必须跟踪它,可能是你的托管公司。
但有两件事:完整性的一些信息,以及潜在的解决方法:
dataType
是您希望从服务器返回的类型。 contentType
是您要将发送到服务器的数据类型。
对于您要发送的请求,请关闭contentType
是正确的,因为默认的jQuery将使用PHP预期会看到的内容。
您根本不必指定dataType
;相反,您应确保响应带有正确的Content-Type
标头。这意味着确保您的服务器配置正确(对于静态内容),并且您的PHP代码在必要时通过header("Content-Type: data/type-here")
设置正确的标头指定dataType
的唯一原因是您是否不控制服务器并且你知道它发回了错误的类型。
如果您需要尝试解决这个问题,请先询问:如果有人直接向我发送恶意HTML,而不是通过我的网页会怎么样?答案是:您需要小心你的内容做HTML。例如:如果您要存储此HTML然后将其(作为HTML)显示给用户,那么这是一个跨站点脚本漏洞,您必须在执行此操作之前严格清理该HTML。
在您自己回答这个问题之前,请不要继续进行任何解决方法。
好吧,所以就解决它而言(一旦你有健全的安全措施):你可能会发送JSON而不是标准表格,希望拒绝表格的任何内容都不会看到它。要做到这一点,你要改变你的ajax电话:
var page = {
html: document.querySelector("article").innerHTML,
url: <?php echo "'$current_page'"; ?>
};
$.ajax({
url:'https://example.com/update.php',
type:'post',
data: JSON.stringify(page),
contentType: 'application/json; charset=UTF8',
success:function(data){
window.location.reload();
}
});
然后在PHP方面,你会读到JSON并解析它(阅读下面的代码来自this answer):
$entityBody = json_decode(stream_get_contents(STDIN));
$content = $entityBody['html'];
$page = $entityBody['url'];
file_put_contents($page, $content, LOCK_EX);
再次:请不要使用此,除非您拥有强大的防XSS安全措施。而且,如果您拥有强大的反XSS安全措施,您可以通过更改服务器配置来使用普通表单。