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

问题描述 投票:3回答:7

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

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

post工作正常,如果它不包含URL,但是,如果包含URL,那么我得到:

POST script.php 403 (Forbidden)

有没有什么方法可以清理这个URL列表或什么东西来防止它403ing?

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

jquery post xss http-status-code-403 httpforbiddenhandler
7个回答
3
投票

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

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

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

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

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

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

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

3
投票

它完全取决于你的listOfURLs是什么,你只需要记住,post请求的数据部分应该始终是一个字符串,所以解决方案可能是:

  • 如果ListOfURLs是一个数组,你应该这样做: $ .post(“script.php”,{'urls []':[“URL1”,“URL2”]});
  • 如果它是表单数据,您可以将其序列化为json字符串。
  • 如果不是任何一个,试着让它像json

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


1
投票

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

var encodedUrl = encodeURIComponent(url);

1
投票

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

我不喜欢这个ajax调用的简短形式。如果您希望在代码中获得更多概述,请使用long syntax of JQuerySee 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发回。


0
投票

您使用Nginx作为您的Web服务器吗? Nginx不支持这样的帖子请求;您可以通过在服务器下的配置中添加以下内容来解决此限制。

    error_page 405 =200 $request_uri;

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


0
投票

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

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

有了这个

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

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

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

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


0
投票

你只需附加一些额外的字符串就可以添加你的网址

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

并将此数据传递给ajax。所以你得到的网址数据没有403禁止错误

© www.soinside.com 2019 - 2024. All rights reserved.