それともPHPのバイナリストリームの問題についてでしょうか?
以前に投稿しました: http://bbs.csdn.net/topics/391024843
モデレータは回答を提供し、それを解析できましたが、結果が実際の結果と完全に異なることがわかりました。サーバーが私に返されました: ip: 107.145.107.140、port: 26773
しかし、それを解析すると、次のようになりました: ip: 46.48.46.48、port: 63271
これは、ノードを取得するために PHP を使用しています。情報を解析してノードを追加します。情報を自分で解析して出力し、解析するために解析されていないデータを pthon に送信します。その後、両方を比較して、結果が異なることを確認します
PHP (swoole を使用):
<?php$serv = new swoole_server('0.0.0.0', 6882, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);$serv->set(array( 'worker_num' => WORKER_NUM, 'daemonize' => false, 'max_request' => MAX_REQUEST, 'dispatch_mode' => 2, 'debug_mode' => 1));$serv->on('Start', function($serv){ echo "DHT Server start...\n"; $nid = get_node_id(); $msg = array( 't' => entropy(2), 'y' => 'q', 'q' => 'find_node', 'a' => array( 'id' => $nid, 'target' => $nid ) ); $serv->sendto(gethostbyname('router.bittorrent.com'), 6881, encode($msg));});$serv->on('Receive', function($serv, $fd, $from_id, $data){ echo "New receive from ip: "; $msg = decode($data); $fdinfo = $serv->connection_info($fd); echo $fdinfo['remote_ip'] . "\n"; if($msg['y'] == 'r'){ if(array_key_exists('nodes', $msg['r'])) //$this->response_actions($msg, array($fdinfo['remote_ip'], $fdinfo['remote_port'])); $nodes = decode_nodes($msg['r']['nodes']); foreach($nodes as $node){ echo "nid: " . $node->nid . ", ip: " . $node->ip . ", port: " . $node->port . "\n"; } $serv->sendto('127.0.0.1', 6813, $data); }});function entropy($length=20){ $s = ''; for($i=0;$i<$length;$i++) $s .= chr(mt_rand(0, 255)); return $s; }function get_node_id(){ return sha1(entropy()); }function get_neighbor($target, $nid){ return substr($target, 0, 10) . substr($nid, 0, -10); }function encode($msg){ return Bencode::encode($msg); }function decode($msg){ return Bencode::decode($msg); }function decode_nodes($msg){ $n = array(); $length = strlen($msg); // 由于每个node都为26位, 若总长度不等于26的倍数则直接返回 if(($length % 26) != 0) return $n; $i = 0; while($i<$length){ //$s = substr($msg, $i, 26); //$d = unpack('a20nid/Lip/Sport', $s); //var_dump($d); //$d = unpack('a20nid/lip/sport', $s); //var_dump($d); //$n[] = new Node($d['nid'], long2ip($d['ip']), $d['port']); $nid = substr($msg, $i, 20); var_dump($nid); $ip = substr($msg, $i+20, 4); var_dump($ip); $ip = long2ip(unpack('L', $ip)[1]); $port = substr($msg, $i+24, 2); var_dump($port); $port = unpack('s', $port)[1]; var_dump($port); //$n[] = new Node($nid, $ip, $port); $i += 26; } return $n; }$serv->start();
python:
#!/usr/bin/env python#encoding: utf-8import socketfrom hashlib import sha1from random import randintfrom struct import unpackfrom socket import inet_ntoafrom threading import Timer, Threadfrom time import sleepfrom collections import dequefrom bencode import bencode, bdecodedef decode_nodes(nodes): n = [] length = len(nodes) if(length % 26) != 0: return n for i in range(0, length, 26): nid = nodes[i:i+20] ip = inet_ntoa(nodes[i+20:i+24]) ip2 = nodes[i+20:i+24] print ip2 port = unpack("!H", nodes[i+24:i+26])[0] port2 = nodes[i+24:i+26] print port2 print "decode_nodes: nid: %s, ip: %s, port: %s\n" % (nid, ip, port)class DHTServer(): def __init__(self): self.ufd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) self.ufd.bind(("0.0.0.0", 6813)) def process_find_node_response(self, msg, address): nodes = decode_nodes(msg["r"]["nodes"]) for node in nodes: (nid, ip, port) = node print "find_node: nid: %s, ip: %s, port: %s\n" % (nid, ip, port) def run(self): while True: try: (data, address) = self.ufd.recvfrom(65536) msg = bdecode(data) self.on_message(msg, address) except Exception: pass def on_message(self, msg, address): try: if msg["y"] == "r": if msg["r"].has_key("nodes"): self.process_find_node_response(msg, address) except KeyError: passif __name__ == "__main__": # max_node_qsize bigger, bandwith bigger, spped higher dht = DHTServer() dht.run()
secusterディスカッション(解決策) 、ただし次のようなものです:
エンコードされていない: {" t":"aa", "y":"r", "r":{"id":"0123456789abcdefghij", "nodes":"def456..."}} エンコード後: d1:rd2:id20: 0123456789abcdefghij5:nodes9:def456...e1:t2:aa1:y1:reこのような形式
そして、nodeid、ip、port はノード内のものです
decode_nodes($msg) $msg を実行する場合
DHT プロトコルの説明は次のとおりです: http://blog.csdn.net/xxxxxx91116/article/details/7970815
私はこれをしません、プロトコルテキストを読むことに興味がありません
私にチェックしてほしいなら、私の言うとおりにしてください
4 階のモデレーターの言う通り、エンディアンの問題をチェックしてください。
これで、IPアドレスは正しく取得できましたが、ポートはまだ解決されていません。確かにビッグエンディアンが使用されていますが、PHPにはこれらの形式しかありません。それぞれ試しましたが、正しくなく、落ち込んでいます。 。 。
それで、何ができるでしょうか?データの投稿をお願いしましたが、拒否されましたので、これが唯一の方法です
ああ、拒否はありません。次のような感じです:
たとえば、サーバーがデータを送信した場合、IP は 188.19.238.146 です。 、ポートは: 6881、そして I インターセプトされたポート ビットの 2 バイト データは:?
次のステップは、ネットワーク バイト オーダーをデコードしてポート番号に変換することです: unpack("n", $port) , しかし、変換は57763となり、use unpack("s ", $port)は-23583となり、using unpack("S", $port)は41953になります
受け取ったデータをbase64_encodeでエンコードしてほしいなぜそれがそんなに難しいのですか?
受け取ったデータをbase64_encodeでエンコードして渡してくださいと言いましたが、なぜそんなに難しいのですか?
申し訳ありませんが、これはデータです:
ZDE6cmQyOmlkMjA6daCpq0ZCdc6JP5An4ac4g4tlvPg1Om5vZGVzNDE2Oj4jyz4WVIOIxzAe2MXW4TWcH8dddZ6SRDktJ+7silGRA0YlQqlqucmPix2E6MZCvQ2ZY90lCzORZu5ZytoyWpBtKzh4PVNLMrz+Vo4exiqGYEUq3sV501VNWQ5XcqsXfXftr47cYrvZHsF4DCDFWnMcgC2Aq/DHVz00Wbxfm9qPqlsdaJ4um4dXnVtZ6BLCGgy42Pw3zVOnROrqVgpFb1J5g+BAxB2NOUMBBW7FQCyycNBojCpaDATl59Ekq4HpaHqD1gW057xisIRLgEp9f9VZvdr60s6C3CBNCX/OvoTfeJyY40k3SdswZ1lTimGVQRb7T7/VTO1rgXkZFTpuvAYbPCJaWUpbXcILoZh8A8H/qzKyirIM0v8lycJgFFdeiZR7bq+aPmxHVL1Scc6M3YMH17kiA8lK3l06cqN65EvX3/CuWJ4uw+fDhqSjVCkrwlpdQYO8k8mjkZhdVAaHCBUDxw9ESlvAXxuYGuFHYq2GV1BOhSYgmPJSaOzkghl0kq9lCiQvWUhr/ewsm/X/90CEXsTS45jet3HqWuZ2KcjVZTE6dDI6e8cxOnkxOnJl
Python には
n = [] length = len(nodes) if(length % 26) != 0: return n
モジュロ 26 は 6 です
指定したデータが正しいことを確認してください
Python には
n = [] length = len(nodes) if(length % 26) != 0: return n
Modulo 26 は 6 です
与えたデータが正しいことを確認してください
ああ、申し訳ありませんが、あなたが与えたものはそれだけです。は元の取得データで、% 26 は Bencode によってデコードされたノード データです。申し訳ありませんが、このデータを取得するのを忘れていました。 。 。
これは、取得されたすべてのデータを含む元のデータです。 y = r など
ZDE6cmQyOmlkMjA6O+Bji1UaqD0DtxQvYyoA6qxsWGQ1Om5vZGVzNDE2Oj/SyPVGoEWNKA31UnEp7simR5o0TuvCi3ZXP9LI9UagRY0oDfVScSnuyKZHmjRO68KLdlc/0sj1RqBFjSgN9VJxKe7IpkeaNE7rwot2Vz/8I+41PITGHXJVPESiGTTO7b2UsbfqyB+QP/wj7jU8hMYdclU8RKIZNM7tvZSxt+rIH5A//CPuNTyExh1yVTxEohk0zu29lLG36sgfkD//TOin7ijhPGnlvhNEku1IO1B2ZcxGPhrhP/9M6KfuKOE8aeW+E0SS7Ug7UHZlzEY+GuE//0zop+4o4Txp5b4TRJLtSDtQdmXMRj4a4T5OjQM7NuWY8RSq0Ca2RI235AIYPBmGgBrhPk6NAzs25ZjxFKrQJrZEjbfkAhg8GYaAGuE+To0DOzblmPEUqtAmtkSNt+QCGDwZhoAa4T7PZbZs/9SbpdgANMEQ8dHeHtgBUeAsw9vgPs9ltmz/1Jul2AA0wRDx0d4e2AFR4CzD2+A+z2W2bP/Um6XYADTBEPHR3h7YAVHgLMPb4D2owBNmJWRvv7qjzQoEM7j+lo0O36b9DRrhZTE6dDg6LZGYmOd7p/sxOnkxOnJl
これは、bencode によってデコードされたノード データです。つまり、このデータはそれぞれ 26 バイトに分割され、20 バイトを取り出します-バイトの nid、4 バイトの ip、および 26 バイトのポート:
P9LI9UagRY0oDfVScSnuyKZHmjRO68KLdlc/0sj1RqBFjSgN9VJxKe7IpkeaNE7rwot2Vz/SyPVGoEWNKA31UnEp7simR5o0TuvCi3ZXP/wj7jU8hMYdclU8RKIZNM7tvZSxt+rIH5A//CPuNTyExh1yVTxEohk0zu29lLG36sgfkD/8I+41PITGHXJVPESiGTTO7b2UsbfqyB+QP/9M6KfuKOE8aeW+E0SS7Ug7UHZlzEY+GuE//0zop+4o4Txp5b4TRJLtSDtQdmXMRj4a4T//TOin7ijhPGnlvhNEku1IO1B2ZcxGPhrhPk6NAzs25ZjxFKrQJrZEjbfkAhg8GYaAGuE+To0DOzblmPEUqtAmtkSNt+QCGDwZhoAa4T5OjQM7NuWY8RSq0Ca2RI235AIYPBmGgBrhPs9ltmz/1Jul2AA0wRDx0d4e2AFR4CzD2+A+z2W2bP/Um6XYADTBEPHR3h7YAVHgLMPb4D7PZbZs/9SbpdgANMEQ8dHeHtgBUeAsw9vgPajAE2YlZG+/uqPNCgQzuP6WjQ7fpv0NGuE=
$s = 'P9LI9UagRY0oDfVScSnuyKZHmjRO68KLdlc/0sj1RqBFjSgN9VJxKe7IpkeaNE7rwot2Vz/SyPVGoEWNKA31UnEp7simR5o0TuvCi3ZXP/wj7jU8hMYdclU8RKIZNM7tvZSxt+rIH5A//CPuNTyExh1yVTxEohk0zu29lLG36sgfkD/8I+41PITGHXJVPESiGTTO7b2UsbfqyB+QP/9M6KfuKOE8aeW+E0SS7Ug7UHZlzEY+GuE//0zop+4o4Txp5b4TRJLtSDtQdmXMRj4a4T//TOin7ijhPGnlvhNEku1IO1B2ZcxGPhrhPk6NAzs25ZjxFKrQJrZEjbfkAhg8GYaAGuE+To0DOzblmPEUqtAmtkSNt+QCGDwZhoAa4T5OjQM7NuWY8RSq0Ca2RI235AIYPBmGgBrhPs9ltmz/1Jul2AA0wRDx0d4e2AFR4CzD2+A+z2W2bP/Um6XYADTBEPHR3h7YAVHgLMPb4D7PZbZs/9SbpdgANMEQ8dHeHtgBUeAsw9vgPajAE2YlZG+/uqPNCgQzuP6WjQ7fpv0NGuE=';$s = base64_decode($s);foreach(str_split($s, 26) as $s) { $r = unpack('a20n/Nip/np', $s); $r['ip'] = long2ip($r['ip']); print_r($r);}
Array( [n] => ?ÒÈõF E?(õRq)îȦG?4 [ip] => 78.235.194.139 [p] => 30295)Array( [n] => ?ÒÈõF E?(õRq)îȦG?4 [ip] => 78.235.194.139 [p] => 30295)Array( [n] => ?ÒÈõF E?(õRq)îȦG?4 [ip] => 78.235.194.139 [p] => 30295)Array( [n] => ?ü#î5<?ÆrU<D¢4Îí½” [ip] => 177.183.234.200 [p] => 8080)Array( [n] => ?ü#î5<?ÆrU<D¢4Îí½” [ip] => 177.183.234.200 [p] => 8080)Array( [n] => ?ü#î5<?ÆrU<D¢4Îí½” [ip] => 177.183.234.200 [p] => 8080)Array( [n] => ?ÿLè§î(á<iå¾D’íH;Pv [ip] => 101.204.70.62 [p] => 6881)Array( [n] => ?ÿLè§î(á<iå¾D’íH;Pv [ip] => 101.204.70.62 [p] => 6881)Array( [n] => ?ÿLè§î(á<iå¾D’íH;Pv [ip] => 101.204.70.62 [p] => 6881)Array( [n] => >N?;6å?ñª?&¶D?·ä [ip] => 60.25.134.128 [p] => 6881)Array( [n] => >N?;6å?ñª?&¶D?·ä [ip] => 60.25.134.128 [p] => 6881)Array( [n] => >N?;6å?ñª?&¶D?·ä [ip] => 60.25.134.128 [p] => 6881)Array( [n] => >Ïe¶lÿÔ?¥Ø4ÁñÑ?Ø [ip] => 81.224.44.195 [p] => 56288)Array( [n] => >Ïe¶lÿÔ?¥Ø4ÁñÑ?Ø [ip] => 81.224.44.195 [p] => 56288)Array( [n] => >Ïe¶lÿÔ?¥Ø4ÁñÑ?Ø [ip] => 81.224.44.195 [p] => 56288)Array( [n] => =¨Àf%do¿º£Í3¸??? [ip] => 223.166.253.13 [p] => 6881)
$s = 'P9LI9UagRY0oDfVScSnuyKZHmjRO68KLdlc/0sj1RqBFjSgN9VJxKe7IpkeaNE7rwot2Vz/SyPVGoEWNKA31UnEp7simR5o0TuvCi3ZXP/wj7jU8hMYdclU8RKIZNM7tvZSxt+rIH5A//CPuNTyExh1yVTxEohk0zu29lLG36sgfkD/8I+41PITGHXJVPESiGTTO7b2UsbfqyB+QP/9M6KfuKOE8aeW+E0SS7Ug7UHZlzEY+GuE//0zop+4o4Txp5b4TRJLtSDtQdmXMRj4a4T//TOin7ijhPGnlvhNEku1IO1B2ZcxGPhrhPk6NAzs25ZjxFKrQJrZEjbfkAhg8GYaAGuE+To0DOzblmPEUqtAmtkSNt+QCGDwZhoAa4T5OjQM7NuWY8RSq0Ca2RI235AIYPBmGgBrhPs9ltmz/1Jul2AA0wRDx0d4e2AFR4CzD2+A+z2W2bP/Um6XYADTBEPHR3h7YAVHgLMPb4D7PZbZs/9SbpdgANMEQ8dHeHtgBUeAsw9vgPajAE2YlZG+/uqPNCgQzuP6WjQ7fpv0NGuE=';$s = base64_decode($s);foreach(str_split($s, 26) as $s) { $r = unpack('a20n/Nip/np', $s); $r['ip'] = long2ip($r['ip']); print_r($r);}
Array( [n] => ?ÒÈõF E?(õRq)îȦG?4 [ip] => 78.235.194.139 [p] => 30295)Array( [n] => ?ÒÈõF E?(õRq)îȦG?4 [ip] => 78.235.194.139 [p] => 30295)Array( [n] => ?ÒÈõF E?(õRq)îȦG?4 [ip] => 78.235.194.139 [p] => 30295)Array( [n] => ?ü#î5<?ÆrU<D¢4Îí½” [ip] => 177.183.234.200 [p] => 8080)Array( [n] => ?ü#î5<?ÆrU<D¢4Îí½” [ip] => 177.183.234.200 [p] => 8080)Array( [n] => ?ü#î5<?ÆrU<D¢4Îí½” [ip] => 177.183.234.200 [p] => 8080)Array( [n] => ?ÿLè§î(á<iå¾D’íH;Pv [ip] => 101.204.70.62 [p] => 6881)Array( [n] => ?ÿLè§î(á<iå¾D’íH;Pv [ip] => 101.204.70.62 [p] => 6881)Array( [n] => ?ÿLè§î(á<iå¾D’íH;Pv [ip] => 101.204.70.62 [p] => 6881)Array( [n] => >N?;6å?ñª?&¶D?·ä [ip] => 60.25.134.128 [p] => 6881)Array( [n] => >N?;6å?ñª?&¶D?·ä [ip] => 60.25.134.128 [p] => 6881)Array( [n] => >N?;6å?ñª?&¶D?·ä [ip] => 60.25.134.128 [p] => 6881)Array( [n] => >Ïe¶lÿÔ?¥Ø4ÁñÑ?Ø [ip] => 81.224.44.195 [p] => 56288)Array( [n] => >Ïe¶lÿÔ?¥Ø4ÁñÑ?Ø [ip] => 81.224.44.195 [p] => 56288)Array( [n] => >Ïe¶lÿÔ?¥Ø4ÁñÑ?Ø [ip] => 81.224.44.195 [p] => 56288)Array( [n] => =¨Àf%do¿º£Í3¸??? [ip] => 223.166.253.13 [p] => 6881)
とてもありがとうございます。最初にインターセプトしたときに間違ったインターセプトをしたため、得られた結果が正しくありませんでした。ありがとうございます。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。
