如果 URL 在数据中,POST 返回 403

Posted

技术标签:

【中文标题】如果 URL 在数据中,POST 返回 403【英文标题】:POST returns 403 if URL is in data 【发布时间】:2013-10-08 10:41:01 【问题描述】:

我正在做一个简单的 jQuery 帖子:

$.post( "script.php",  urls: listOfURLs );

post 如果不包含 URL,则可以正常工作,但是,如果包含 URL,则我得到:

POST script.php 403 (Forbidden)

有什么方法可以清理这个 URL 列表或防止它出现 403 错误吗?

所涉及的一切都在同一个域中。

【问题讨论】:

你的网站在线吗??? 给出您使用此代码的页面链接? 我宁愿不在开发阶段。 什么是 listOfURLs @undefined 就像它的名字一样,是一个 URL 列表。它恰好是一个 javascript 数组,每个数组都包含一个 URL 字符串。 【参考方案1】:

据我所知:这个“错误”在服务器端。

作为第二个参数传递给$.post() 方法的对象在您的请求中被简单地序列化为数据。

您可以通过查看浏览器的 Web 控制台(例如:Firebug 的“网络”选项卡,或 Firefox 内置控制台的“网络”选项卡,或 Chrome 或 IE 中的类似选项卡)查看发送到服务器的内容)。我的猜测是您的请求与您提供的数据一起正确发送。

您的服务器如何处理这些数据是另一回事;您将需要调试您的服务器配置和服务器端代码,以确定您的请求最终如何触发403

403 的一个可能原因是文件权限错误。检查您的文件权限是否允许 Web 服务器访问它们。

例如,如果您使用标准的 apache/linux 配置,请检查:

用户www-data对所有代码目录拥有x权限 用户www-data 对所有代码文件拥有r 权限 用户www-data 对应该下载或上传的文件拥有正确的权限 您的站点配置文件会删除某些目录的访问权限 您的 .htaccess 文件删除了某些目录的访问权限 等等...

【讨论】:

我想他说他只有在发送urls: listOfURLs时才会得到403。 很抱歉错过了赏金窗口...这就是问题所在。我不知道,服务器上存在一些疯狂的安全问题,将我的 POST 标记为恶意并阻止它们。【参考方案2】:

这完全取决于您的listOfURLs 是什么,您只需要记住,发布请求的数据部分应该始终是一个字符串,因此解决方案可能是:

如果 ListOfURLs 是一个数组,你应该这样做:

$.post("script.php", 'urls[]': ["URL1", "URL2"] );

如果是表单数据,可以序列化为json字符串。

如果没有,请尝试将其设为json 喜欢。

如果这不起作用,请向我们提供有关数据本身的一些其他详细信息

【讨论】:

【参考方案3】:

尝试对列表中的 URL 进行 url 编码,然后传递给它

var encodedUrl = encodeURIComponent(url);

【讨论】:

【参考方案4】:

403 告诉您系统尝试使用您尝试发送的对象访问 URL 或资源。

我不喜欢这种 ajax 调用的简短形式。如果您喜欢代码中的更多概述,请使用long syntax of JQuery。 See this for more information.

$.ajax(
    type: "POST",
    url: url,
    data: listofURLs2JSON,
    dataType: "json",
    statusCode: 
        404: function() 
            alert( "List of urls. Nooooo" );
        
    ,
    success: function(data) 
        alert( "This was totally awesome!" );
    ,
);

正如 Labib 指出的那样,您可以使用 JSON 来避免 403。要反序列化对象,请使用JSON.stringify:

var listofURLs2JSON = JSON.stringify(array/object, callback);

然后您可以将对象作为字符串接收并使用像json_decode 这样的php 函数将数据作为变量检索,做任何您想做的事情并通过json_encode 将其发送回。

【讨论】:

【参考方案5】:

您是否使用 nginx 作为您的 Web 服务器? Nginx 不支持这样的 post 请求;您可以通过将以下内容添加到服务器下的配置来解决此限制。

    error_page 405 =200 $request_uri;

真正发生的是 Nginx 正在生成 HTTP 响应 405,然后尝试访问 HTTP 405 的错误文档并在显示的内容上获得 403。

【讨论】:

【参考方案6】:

您的代码中有错误。你应该替换这个:

$.post( "script.php",  urls: listOfURLs );

有了这个

$.post( "script.php",  'urls[]': listOfURLs );

因为listOfURLs 是一个javascript 数组。这可以解释为什么如果 URL 列表为空,您的代码会起作用。

请参阅post() 文档页面上的第三个示例:jQuery.post() |jQuery API

如果这没有帮助,我会尝试使用 Fiddler2 仔细查看您的代码在发布时所做的调用。该程序将向您显示正在调用的 URL 和正在发布的数据。这对于调试这类问题非常有用。

【讨论】:

【参考方案7】:

你只需在你的 url 后面加上一些额外的字符串,比如

listURL = "data_url:"+listURL+"";

并将这些数据传递给 ajax。这样你就可以得到没有 403 禁止错误的 url 数据

【讨论】:

以上是关于如果 URL 在数据中,POST 返回 403的主要内容,如果未能解决你的问题,请参考以下文章

Django 在发送 POST 请求时返回 403 错误

$GET/$POST 中的 "+have+" 导致服务器返回 403 Forbidden

Django API Post 方法返回 403 错误

Angular http post 仅在 Chrome 中在服务器上返回 403 错误

Tomcat 启用 CORS:来自 Safari 的 POST 请求返回 200,Chrome 和 Firefox 返回 403

配置 Spring Security 为 REST URL 返回 403 并重定向到其他 URL 的登录