我编写了一些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()错误,但页面实际上不会更新。
是否需要根据contentType
的值(例如``Application/json''或 'text/plain; charset=utf-8'
的值,需要以不同的方式访问帖子数据?因为即使有200个响应代码,更新似乎也不会显示在网页上。
使用application/x-www-form-urlencoded; charset=UTF-8
更新了一些页面,但给出了403()
错误。
正如罗里所说的(和我一样,在我看过他的评论时删除的答案一样;他是正确的评论),403回应代码可能并不意味着dataType
或contentType
存在问题。您应该寻找服务器拒绝满足请求的其他原因。例如,当您发布HTML时,也许您(或您的Web主机)会进行某种反标记保护保护。您必须与您的托管公司一起跟踪。
但是有两件事:一些有关完整性的信息和潜在的解决方法:
dataType
是您期望从服务器上 Back 的类型。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并解析它(以下从此答案中读取代码):
$entityBody = json_decode(stream_get_contents(STDIN));
$content = $entityBody['html'];
$page = $entityBody['url'];
file_put_contents($page, $content, LOCK_EX);
再次:请不要使用此,除非您有强大的反XSS保障措施。同样,如果您对HAEV进行了强大的反XSS保护措施,则可以通过更改服务器配置来使用正常表单。