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

时间:2013-10-02 05:05:01

标签: jquery post xss http-status-code-403 httpforbiddenhandler

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

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

如果post不包含任何网址,则POST script.php 403 (Forbidden) 可以正常工作,但是,如果包含网址,那么我会得到:

{{1}}

是否有某种方法可以清理此URL列表或其他内容以阻止它进行403ing?

涉及的所有内容都在同一个域中。

7 个答案:

答案 0 :(得分:3)

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

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

    $ .post(“script.php”,{'urls []':[“URL1”,“URL2”]});

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

  • 如果不是,请尝试将其json改为。

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

答案 1 :(得分:3)

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

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

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

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

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

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

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

答案 2 :(得分: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发回。

答案 3 :(得分:1)

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

var encodedUrl = encodeURIComponent(url);

答案 4 :(得分:0)

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

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

用这个

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

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

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

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

答案 5 :(得分:0)

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

    error_page 405 =200 $request_uri;

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

答案 6 :(得分:0)

您只需在URL后面附加一些其他字符串,例如

Handle

并将此数据传递给ajax。这样您获得的网址数据不会出现403禁止错误