2012-01-06 14 views
2

ローカルネットワーク上の私の家族のための単純なhttpサーバを作成しました.HTMLファイルとPNG画像を追加してHTMLファイルを表示しようとしましたが、画像を読み込めませんでした。
それは言う:
"イメージ『のhttp:// :。。255/header.pngを』それはエラーが含まれているため、表示できません。"
はここに私のコードpython httpウェブサーバ

 elif self.path.endswith(".bm"): #our dynamic content 
      self.send_response(200) 
      self.send_header('Content-type', 'text/html') 
      self.end_headers() 
      f= open(curdir + sep + self.path) 
      ren = self.render(f.read()) 
      self.wfile.write(ren) 
      return 
     elif self.path.endswith('.png'): 
      print "IMAGE WANTED!" 
      self.send_response(200) 
      self.send_header('Content-type', 'image/png') 
      self.end_headers() 
      f = open(curdir + sep + self.path) 
      self.wfile.write(f.read()) 
      return 
     elif self.path.endswith('.jpg'): 
      print "IMAGE WANTED!" 
      self.send_response(200) 
      self.send_header('Content-type', 'image/jpeg') 
      self.end_headers() 
      f= open(curdir + sep + self.path) 
      print f.read() 
      self.wfile.write(f.read()) 
      return 
     elif self.path.endswith(".esp"): 
      self.send_response(200) 
      self.send_header('Content-type', 'text/plain') 
      self.end_headers() 
      self.wfile.write("This Format Is Not Supported Any More, Upgrade To BM Script") 
      return 

のビットである彼らのPNGとJPEGのセクションを除くすべての作業。 BMのスクリプト私は自分自身、espと同じですので、それはまったく無しです

+2

広いセキュリティホールが開いているので、インターネットからアクセスできないことを教えてください( '../../../ etc/passwd \ 0'のような相対パスを許可します)。 –

+5

なぜ組み込みの 'python -m SimpleHTTPServer'を使用しないでください。これにより、現在のディレクトリが表示されます。 – wim

答えて

7

デフォルトモードopen'r'です。これはテキストデータの読み取りを意味し、Windowsでは自動EOL変換を行います。

fn = os.path.normpath(os.path.join(curdir, self.path)) 
if not fn.startswith(abspath + os.path.sep): 
    raise Exception('Path traversal attempt') 
with open(fn, 'rb') as f: 
    self.wfile.write(f.read()) 

f = open(curdir + sep + self.path); self.wfile.write(f.read())を交換しwith文は、ファイルハンドルのリークを修正します。代わりに(Python < 2.5)、f.close()を手動で呼び出すことができます。

os.path.join(ファイルの先頭にはimport os.pathが必要な場合があります)は、文字列連結よりもクリーンなファイル名構成メカニズムです。結果のファイル名が期待どおりのディレクトリにあることを確認すると、誰でもシステム上のすべてのファイルを読み取ることができるようになります(path traversal vulnerability)。

+0

私は何かが不足しているかもしれませんが、* normpath *はどのようにパストラバーサルを防ぎますか?私の理解は、それは基本的にちょうどそれを掃除、パスを "正常化"していることです。 A // B、A/B /、A /./B、A/foo /../BはすべてA/Bになります。 – monkut

+0

@monkut - normpathを使ってwebルートをユーザパスに参加させ、それがwebrootで実際に始まることを確認します: 'import os; root = "/ web/root"; path_from_client = "../../etc/passwd"; os.path.normpath(os.path.join(root、path_from_client))。startswith(root) ' – jdi

+0

@jdiこれは意味がありますが、ここでの回答では明確ではありません。 * normpath *への呼び出しだけでは、パストラバーサルからあなたを守ることはできません。 – monkut

関連する問題