小编Roc*_*man的帖子

JSON Hijacking在现代浏览器中仍然是一个问题吗?

我正在使用Backbone.js和Tornado Web服务器.在Backbone中接收集合数据的标准行为是作为JSON数组发送.

另一方面,由于以下漏洞,Tornado的标准行为是不允许使用JSON Array:

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

相关的一个是:http: //haacked.com/archive/2009/06/25/json-hijacking.aspx

当我真的是一个对象列表时,我不必在对象中包装我的JSON.

我无法在现代浏览器中重现这些攻击(即当前的Chrome,Firefox,Safari和IE9).与此同时,我无法确认现代浏览器解决这些问题的任何地方.

为了确保我既没有任何可能的糟糕的编程技能,也没有糟糕的谷歌搜索技能:

在现代浏览器中,这些JSON劫持攻击现在仍然是一个问题吗?

(注意:很抱歉可能重复:在现代浏览器上可以进行'JSON劫持'吗? 但由于接受的答案似乎没有回答这个问题 - 我认为现在是时候再问一遍并得到一些更明确的解释.)

javascript browser security json tornado

142
推荐指数
1
解决办法
3万
查看次数

如何使用python Tornado服务器在请求中最佳地执行多处理?

我正在使用I/O非阻塞python服务器Tornado.我有一类GET请求可能需要很长时间才能完成(想想在5-10秒的范围内).问题是Tornado会阻止这些请求,以便随后的快速请求被保留,直到缓慢的请求完成.

我查看了:https://github.com/facebook/tornado/wiki/Threading-and-concurrency,得出结论我想要#3(其他进程)和#4(其他线程)的某种组合.#4本身有问题,当有另一个线程正在进行"重举"时,我无法获得可靠的控制回ioloop.(我假设这是由于GIL以及heavy_lifting任务具有高CPU负载并且不断控制远离主ioloop的事实,但这是猜测).

所以我一直在原型化如何通过GET在单独的进程中在这些缓慢的请求中执行"繁重的"任务来解决这个问题,然后在完成该请求的过程中将回调放回到Tornado ioloop中.这释放了ioloop来处理其他请求.

我创建了一个演示可能解决方案的简单示例,但我很想从社区获得反馈.

我的问题有两个方面:如何简化当前的方法?它可能存在哪些陷阱?

该方法

  1. 利用Tornado的内置asynchronous装饰器,允许请求保持打开状态并继续ioloop.

  2. 使用python的multiprocessing模块为"繁重的"任务生成一个单独的过程.我首先尝试使用该threading模块,但无法将任何可靠的放弃控制权交还给ioloop.它似乎mutliprocessing也会利用多核.

  3. 使用threading正在工作的模块在主ioloop进程中启动一个"观察者"线程,multiprocessing.Queue以便在完成时查看"繁重"任务的结果.这是必要的,因为我需要一种方法来知道重载任务已经完成,同时仍能通知ioloop此请求现已完成.

  4. 确保'观察者'线程经常通过time.sleep(0)调用放弃对主ioloop循环的控制,以便继续处理其他请求.

  5. 当队列中有结果时,从"观察者"线程添加回调,使用tornado.ioloop.IOLoop.instance().add_callback()该回调记录是从其他线程调用ioloop实例的唯一安全方法.

  6. 请务必调用finish()回调以完成请求并移交回复.

下面是一些显示此方法的示例代码. multi_tornado.py是实现上述大纲的服务器,call_multi.py是一个示例脚本,它以两种不同的方式调用服务器来测试服务器.两个测试都调用服务器3个慢GET请求,然后是20个快速GET请求.结果显示在打开和不打开线程的情况下运行.

在使用"无线程"运行它的情况下,3个慢速请求阻塞(每个需要花费一点多秒才能完成).20个快速请求中的一些请求在ioloop中的一些慢速请求之间挤压(不完全确定如何发生 - 但可能是我在同一台机器上运行服务器和客户端测试脚本的工件).这里的要点是所有快速请求都被保持不同程度.

如果在启用线程的情况下运行它,则20个快速请求立即首先完成,然后三个慢速请求在几乎同时完成,因为它们各自并行运行.这是期望的行为.三个慢速请求并行完成需要2.5秒 - 而在非线程情况下,三个慢速请求总共需要3.5秒.所以总体上加速了大约35%(我假设由于多核共享).但更重要的是 - 快速请求立即以慢速列表处理.

我对多线程编程没有很多经验 - 所以虽然这看起来很有用,但我很想知道:

有没有更简单的方法来实现这一目标?在这种方法中潜藏着什么怪物?

(注意:未来的权衡可能是使用反向代理运行更多Tornado实例,如nginx进行负载平衡.无论我将使用负载均衡器运行多个实例 - 但我担心只是抛出硬件来解决这个问题因为看起来硬件在阻塞方面与问题直接相关.)

示例代码

multi_tornado.py (样本服务器):

import time
import threading
import multiprocessing
import math

from tornado.web import RequestHandler, Application, asynchronous …
Run Code Online (Sandbox Code Playgroud)

python tornado multiprocessing python-multithreading

46
推荐指数
3
解决办法
2万
查看次数

如何使用python mock直接模拟超类?

我正在使用python模拟框架进行测试(http://www.voidspace.org.uk/python/mock/),我想模拟一个超类,并专注于测试子类的添加行为.

(对于那些感兴趣的人,我已经扩展了pymongo.collection.Collection,我想只测试我添加的行为.我不想将mongodb作为另一个进程进行测试.)

对于此讨论,A是超类,B是子类.此外,我定义了直接和间接超类调用,如下所示:

class A(object):
    def method(self):
        ...

    def another_method(self):
        ...

class B(A):
    def direct_superclass_call(self):
        ...
        A.method(self)

    def indirect_superclass_call(self):
        ...
        super(A, self).another_method()
Run Code Online (Sandbox Code Playgroud)

方法#1

A调用一个名为MockA的模拟类,并使用mock.patch将其替换为运行时的测试.这会处理直接的超类调用.然后操纵B .__ bases__来处理间接超类调用.(见下文)

出现的问题是我必须编写MockA,在某些情况下(如pymongo.collection.Collection的情况),这可能涉及大量工作来解开所有内部调用模拟.

方法#2

所需的方法是以某种方式使用mock.Mock()类来及时处理模拟上的调用,以及在测试中定义的return_value或side_effect.通过这种方式,我不得不通过避免MockA的定义来做更少的工作.

我遇到的问题是我无法弄清楚如何改变B .__ bases__以便mock.Mock()的实例可以作为超类放置到位(我必须以某种方式在这里做一些直接绑定).到目前为止,我已经确定,super()检查MRO,然后调用定义相关方法的第一个类.我无法弄清楚如何让一个超类来处理它的检查,如果它遇到一个模拟类,就会成功.在这种情况下似乎没有使用__getattr__.我希望super认为此方法已定义,然后像往常一样使用mock.Mock()功能.

super()如何发现MRO序列中类中定义的属性?有没有办法让我插入这里并以某种方式让它在飞行中使用mock.Mock()

import mock

class A(object):
    def __init__(self, value):
        self.value = value      

    def get_value_direct(self):
        return self.value

    def get_value_indirect(self):
        return self.value   

class B(A):
    def __init__(self, …
Run Code Online (Sandbox Code Playgroud)

python mocking

18
推荐指数
2
解决办法
7693
查看次数

开放式websocket连接的安全问题是什么?

我正在构建一个使用websockets的应用程序.我只是允许经过身份验证的用户在登录后打开与服务器的websocket连接,并且已被授予会话ID.

  1. 一旦我与经过身份验证的用户打开了websocket连接,当前的"页面"就会保存打开的websocket连接的详细信息.此时,这种连接是否相对安全?或者我应该在我自己的应用程序级协议中的每个消息上检查一些令牌吗?

  2. 是否存在任何已知的跨站点伪造类型安全问题?有人可以通过让经过身份验证的用户以某种方式执行某些javascript来合作开放的websocket - 从而能够利用开放的websocket连接?

html5 websocket

10
推荐指数
1
解决办法
3201
查看次数

如何在Mongodb中有效地存储和更新二进制数据?

我在文档中存储一个大的二进制数组.我希望不断向此数组添加字节,有时会更改现有字节的值.

我正在寻找一些$ append_bytes和$ replace_bytes类型的修饰符,但看起来我能做的最好就是$ push for arrays.看起来这可以通过执行搜索 - 写入类型操作来实现,如果我以某种方式访问​​磁盘上的底层bson,但我觉得在mongodb中无论如何都有这样做(并且可能是有充分理由的).

如果我只是查询这个二进制数组,编辑或添加它,然后通过重写整个字段来更新文档,这将是多么昂贵?每个二进制数组大约为1-2MB,并且每5分钟更新一次并且跨越1000个文档.更糟糕的是,没有简单的方法将它们(及时)传播出去,它们通常会在5分钟的时间间隔内彼此接近.有没有人对这将是多么灾难有好感?似乎它会有问题.

另一种方法是将此二进制数据作为单独的文件存储在磁盘上,实现线程池以有效地操作磁盘上的文件,并从我的mongodb文档中引用文件名.(我正在使用python和pymongo所以我在看pytables).如果可能的话,我宁愿避免这种情况.

我在这里可以忽略其他任何替代方案吗?

谢谢你的支持.

编辑

在为我的用例编写一些测试的一些工作之后,我决定为二进制数据对象使用单独的文件系统(特别是使用pytables或h5py的hdf5).除了这些二进制数据对象的持久性之外,我仍将使用mongo.通过这种方式,我可以将与追加和更新类型操作相关的性能与我的基本mongo性能分开.

其中一个mongo开发人员确实指出我可以使用点表示法和$ set设置内部数组元素(请参阅下面的注释中的ref),但目前没有办法原子地在数组中执行一系列集合.

此外 - 如果我在我的mongo文档中有1,000个2MB二进制数据字段并且我经常更新和增长它们(至少每5分钟一次) - 我的直觉告诉我mongo将需要管理很多磁盘上文件中的分配/增长问题 - 最终会导致性能问题.我宁愿将其加载到OS级别的单独文件系统来处理.

最后 - 我将使用numpy对我的数据进行操作和执行计算 - pytables和h5py模块允许numpy行为和商店之间的良好集成.

database mongodb

9
推荐指数
1
解决办法
9664
查看次数

Python中的Post-Mortem调试是否允许步进或继续?

我一直在玩验尸调试,但遇到了一些问题.考虑以下pyton脚本example.py:

k = 0
print 1. / k
print 'continue ...'
Run Code Online (Sandbox Code Playgroud)

我可以用以下方式运行:

> python -m pdb example.py
Run Code Online (Sandbox Code Playgroud)

然后跳到第2行print 1. / k然后设置k = 1然后继续使用pdb命令c.

现在,如果我使用事后调试来执行此操作,则无法继续执行程序.我跑:

> python -i example.py
Run Code Online (Sandbox Code Playgroud)

然后在我进入shell之后我做了一个:

import pdb
pdb.pm()
Run Code Online (Sandbox Code Playgroud)

然后我可以k像以前一样更改值,但是我无法继续执行任何程序.Pdb只是退出.

我无法在任何地方发现它明确指出你无法在验尸中逐步完成一个程序.情况似乎如此.那么我想要了解验尸调试的价值.是错误发生时检查代码状态的唯一值吗?

python debugging pdb

8
推荐指数
1
解决办法
1270
查看次数

运行python时如何永久接受OSX防火墙允许/拒绝确认?

概观

我在OSX Mt Lion上的python中使用龙卷风web服务器.每次启动龙卷风服务器时,我都会弹出一个弹出窗口,并且必须允许/拒绝对应用程序的传入访问.

我已将系统偏好设置 - >安全和隐私 - >防火墙中的python二进制文件列为"允许传入连接"...但我仍然每次都会弹出弹出窗口.

我在网上找到了一个参考,表明某些应用可以"检查自己是否签名".这可能是问题,因此忽略了它被列出?

我确认:

codesign -vvv <path to python binary>
Run Code Online (Sandbox Code Playgroud)

收益率:

<path to python binary>: invalid signature (code or signature have been modified)
In architecture: x86_64
Run Code Online (Sandbox Code Playgroud)

这个特殊的二进制文件与自制程序一起安装,带有--framework标志(wxpython需要).

问题

  1. 为什么忽略防火墙列表中二进制应用程序的手动输入?

  2. 是否有一种简单的方法来自己签署二进制文件,以便我可以单击"自动允许已签名的应用程序"并允许它不显示弹出窗口?

python macos firewall osx-mountain-lion

8
推荐指数
2
解决办法
4073
查看次数

Python中意外的相对导入行为

今天我遇到了一个非常令人惊讶的相对进口行为(不幸的是,将我的头发拉了近4个小时后).

我一直认为,如果你在一个名为"package"的包中的模块名称"module_a.py"中有"A类",你可以等效地使用它们:

from package.module_a import ClassA
Run Code Online (Sandbox Code Playgroud)

要么

from module_a import ClassA
Run Code Online (Sandbox Code Playgroud)

只要您从"包"中的模块导入.我明白这是相对重要的.

直到今天,当我需要检查A类对象的实例时,我从未遇到任何问题,我很惊讶地发现了一种非常不寻常的行为.

考虑以下:

包/ module_a.py

class ClassA(object):
    pass

def check_from_module_a(obj):
    print 'from module_a'
    print '-------------'
    print 'class is:', ClassA
    print 'object is', type(obj) 
    print 'is obj a ClassA:', isinstance(obj, ClassA)
Run Code Online (Sandbox Code Playgroud)

包/ module_b.py

from package.module_a import ClassA
from module_a import check_from_module_a

a = ClassA()
check_from_module_a(a)

print ' '
print 'from module_b'
print '-------------'
print 'class is:', ClassA
print 'object is', type(a) 
print 'is obj a ClassA:', isinstance(a, ClassA)
Run Code Online (Sandbox Code Playgroud)

现在执行module_b.py时,你得到:

from …
Run Code Online (Sandbox Code Playgroud)

python python-import

7
推荐指数
1
解决办法
426
查看次数

如何在 APScheduler 中使用 Tornado?

我正在运行 pythonapscheduler并且定期想要对一些 http 资源做一些 POST 工作,这将涉及使用龙卷风AsyncHttpClient作为预定作业。每个作业都会做几个 POST。当每个 http 请求响应时,就会调用一个回调(我认为 Tornado 使用 afuture来完成此操作)。

我在这里关心线程安全,因为Apscheduler在各种线程中运行作业。我还没有找到一个很好解释的例子,说明在这种情况下如何最好地跨多个线程使用龙卷风。

我怎样才能最好地apschedulertornado这种方式使用?

具体问题:

  1. 使用哪个龙卷风ioloop?文档说AsyncHTTPClient“像魔术一样工作”。好吧,魔法让我害怕。我需要AsyncHTTPClient在当前线程中使用还是可以使用主线程(可以指定)?

  2. 我的回调是否存在与我使用的 ioloop 相关的线程安全问题?

  3. 我不清楚当一个线程完成时会发生什么,但仍有一个挂起的回调/未来需要调用。这里有问题吗?

  4. 由于 apscheduler 作为进程内线程运行,并且 python 具有 GIL,那么从主线程拥有一个 IOLoop 是否几乎相同 - 与来自不同线程的多个循环(关于性能)相反?

python concurrency multithreading tornado apscheduler

6
推荐指数
1
解决办法
1626
查看次数

无法在Mac OSX上安装py2cairo

我正在尝试使用brew在python 2.7.3的框架构建(Mac OSX Lion)上安装py2cairo.到目前为止,我一直没有成功.

首先,我尝试了一个简单的

brew install py2cairo
Run Code Online (Sandbox Code Playgroud)

这似乎只适用于python的非框架构建.当我使用不兼容的二进制错误导入cairo时,我在我的框架上执行此操作构建python错误.

其次,我试图通过从github抓取它并发出以下内容来自己构建它:

python waf configure
Run Code Online (Sandbox Code Playgroud)

这失败了:

Checking for library python2.7           : not found 
Checking for library python2.7           : not found 
Checking for library python2.7           : not found 
Checking for library python27            : not found 
Checking for program python2.7-config    : /usr/local/Cellar/python/2.7.3/bin/python2.7-   config 
Checking for header Python.h             : Could not find the python development headers 
The configuration failed
(complete log in /Users/tobin/tmp/py2cairo/build_directory/config.log)
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一切:如何使用默认的python在Mac OSX上安装PyCairo 1.10,但这些都没有帮助.

在我看来,这可能无法找到python2.7库和头文件,因为它是一个框架构建.那可能吗?我正在研究brew公式,看起来框架构建在构建时没有得到--enable-share set.我不确定这是否相关 - 但也许是一种可能性.

任何其他见解都会很棒.提前致谢.

更新:

我发现无法构建py2cairo与gcc使用"-march …

python macos homebrew waf

5
推荐指数
1
解决办法
1925
查看次数