0

编辑:我正在使用不推荐使用apply()的泡菜漏洞进行安全竞赛。apply似乎是您可以使用 pickle 指令字符串调用方法的方式。但是,我很乐意学习更好的方法。

我正在尝试使用在 a 上调​​用apply()send()方法socket._socketobject,但我收到一条奇怪的错误消息。

In [130]: client
Out[130]: <socket._socketobject at 0x108d0bfa0>

In [131]: apply(socket._socketobject.send, (client, "stuff"))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-131-3f9b1f1de824> in <module>()
----> 1 apply(socket._socketobject.send, (client, "stuff"))

TypeError: 'member_descriptor' object is not callable

有趣的是,send()它是函数类型,让我称之为:

In [128]: client.send
Out[128]: <function send>

In [129]: client.send("stuff")
Out[129]: 5

这就是我最初获得名为 client 的套接字对象的方式:

In [107]: import signal

In [108]: sock = socket.socket()

In [109]: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

In [110]: sock.bind(('0.0.0.0', 1025))

In [111]: sock.listen(10)

In [112]: signal.signal(signal.SIGCHLD, signal.SIG_IGN)
Out[112]: 0
In [113]: client, addr = sock.accept()

任何帮助表示赞赏!

4

1 回答 1

2

有趣的是, send() 是函数类型

不正确。send 从它的方法返回一个函数__get__(),因为它是一个描述符。如果您想调用实际的函数,您将需要自己与描述符协议交互。

>>> dir(socket._socketobject.send)
['__class__', '__delattr__', '__delete__', '__doc__', '__format__', '__get__', '__getattribute__', '__hash__', '__init__', '__name__', '__new__', '__objclass__', '__reduce__', '__reduce_ex__', '__repr__', '__set__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> type(socket._socketobject.send)
<type 'member_descriptor'>
于 2012-12-29T02:48:12.750 回答