处理来自多个XHR实例的多个PHP脚本调用

以前设计的问题:http://pastebin.com/cr432nLQ

我已经决定改写关于这个问题的整个问题,并尽可能彻底地去解决。 您可以阅读上面贴上的问题。

首先,感谢大家的回应,但不幸的是,他们让我无处可寻。 我仍然需要帮助解决我的问题。

所以,我使用了一个名为blueimp jQuery File Upload的jQuery插件,它非常好地处理异步文件上传,它包含很多选项。 这个插件对于我的目的来说足够好,但是我需要执行这个服务器端检查,以免受到滥用用户的影响。 我正在讨论限制一次发生的上传数量

该插件默认工作如下:用户选择一些文件(或将它们拖放到放置区域),每个文件创建一个单独的XHR实例,然后调用我的upload.php脚本,该脚本负责存储文件。 PHP上传脚本处理XHR请求,就好像它只有一个图像一样,所以基本上,每个需要上传的图像upload.php单独调用upload.php脚本。

我允许上传我的用户的是图像。 但是,我想对免费用户的上传次数限制为10 ,对高级用户限制为20 。 这是可以通过Javascript完成的,是的,但我并不真的相信Javascript进行这种验证,因此我正在寻求服务器端验证。 但是,如何? 这是不可能的(至少对我来说)是安全的。 我需要以某种方式确保我的上传脚本中用户没有超过10 (或20)图片上传限制。

我发现这个jQuery插件有一个名为singleFileUploads选项:

默认情况下,选择的每个文件都使用XHR类型上传的单个请求上传。 将此选项设置为false可在每个请求中上传文件选择。

注意:使用一个请求上传多个文件需要将multipart选项设置为true(默认)。

  • 类型:布尔值
  • 默认值: true
  • 这相当于我所需要的 - 发送一个完全填充的$_FILES数组,并提供所有提交的图像上传。 但我仍然看到这个问题。 这仍然是由Javascript本身决定的。 用户可以修改这部分脚本并将singleFileUploads设置为false吗? 我认为他们可以! 如果他们不能,那么现在就回答这个问题 - 但我不知道。

    下面的回答表明使用Apache的mod_qos来限制图片上传的数量,但我不知道如何使它对于两种不同的用户类型(免费和收费)有所不同。

    请注意,客人也可以上传图片,并且免费的用户限制也适用于他们。


    那么我对这一切尝试了什么?

    我曾尝试创建一个解决方案,使会话跟踪用户上传的数量,并且对于每次新的上传,会话的价值会增加一个 - 一个解决方案不够安全,因为可以清除Cookie 。 除此尝试之外,我无法应用以下答案中的任何内容。


    这个问题

    那么,从一开始这个问题就非常明确了:我如何安全地限制guest虚拟机/免费用户的并发图像上传数量为10 ,并且限制高级用户的数量为20

    编辑:我想这是值得一提的,每个上传的图像都获得自己的数据库中的行,与上传和名称的时间。 也许这可能有帮助!

    谢谢。


    从你的评论中,我理解你的问题是:“我想限制每个客户端同时上传连接的数量(比如:每个客户端最多同时上传10个)”

    首先:我没有看到你的javascript插件的细节,但我认为它已经允许。 至少应该有一个选项来限制同时请求的数量。
    发现它: limitconcurrentuploads [/编辑]

    更一般地说:PHP不是工作的工具。 在服务器端,文件上传(即:通过http连接接收数据并将其存储在服务器驱动器的文件中的过程)在调用PHP脚本之前由apache(或nginx,或其他)处理。 当您的PHP脚本启动时,文件已经上传,您不能中断脚本内部的传输。

    在服务器端,你应该看看你的php.ini / httpd.conf选项,或者你的apache / .htaccess设置。 php.ini提供了一些关于文件上传(doc)的选项。

    你最好的办法是在javascript中写下这个限制,在客户端。

    如果你真的想要让你的服务器符合要求,你应该研究如何配置你的apache服务器,以限制从同一个IP到给定URL的同时连接数(我还没有找到一个快速,标准的方法来做到这一点)。


    最后一部分:我在ServerFault上发现了这些问题

    Apache2:限制同时请求并限制每个IP /客户端的带宽? (2011年)
    Apache中基于URL的请求速率限制(2011)

    第一个问题的接受答案指向以下apache模块:
    mod_qos

    虽然我没有尝试过。


    您可以在生成主机页(发出xhr调用的页面)时创建一个激活码(即随机数),并将其作为页面内的变量传递给脚本。 然后,您可以修改您的js脚本,将激活代码作为get参数传递给处理文件上传的脚本。 这样,您可以使用激活码作为数据库表的关键字来存储和跟踪使用该代码执行的上载次数。

    请注意,几乎所有的东西都可以通过HTTP / TCP(不仅仅是会话)来操纵,所以你应该问问自己,如果他/她设法利用你的协议,攻击者会取得什么样的成就。

    你没有写太多关于这个问题的背景,但如果你关心的是资源的开采,你可以要求你的用户使用你的服务开一个账户,并设置每小时/每日/每周最多上传的GBs-津贴帐户。

    希望能帮助到你。

    PS。 你确定你确实需要限制每次上传会话的上传次数吗? 由于每次上传都是通过单独调用上传脚本单独处理的,因此如果认为允许用户上传他希望的许多图像可能是安全的。


    也许我不理解你的目标,但是你不能仅仅将会话变量赋值给另一个变量,在每个循环之前重置会话变量,并且使用$ _SESSION计数和“之前”计数之和进行比较? 您是否试图阻止来自每个用户的超过10次聚合上传,或者一次只阻止10次连续上传?

    // Before starting your loop, assign your session variable to another.
    $previously_uploaded = $_SESSION['images_session_uploaded'];
    
    // Reset $_SESSION['images_session_uploaded'] at onset
    $_SESSION['images_session_uploaded'] = 0;
    
    // ... Do yo' thang.
    
    // Make a comparison at the end of each loop for whatever you're checking against.
    if (($_SESSION['images_session_uploaded'] + $previously_uploaded) >= MAX_FREEUSER_UPLOADS_SESSION)
    {
      // User has uploaded more than ten images total, but not necessarily more than ten in this round of uploads. 
    }
    
    链接地址: http://www.djcxy.com/p/76767.html

    上一篇: Handle multiple PHP script calls from multiple XHR instances

    下一篇: Cross Domain Requests Not Working With SoundCloud in Safari