前のブログで bandit を利用し、Webサイトのスクレイピングを行っている pythonプログラムのセキュリティチェックを行ってみました。
すると、上記ブログにも記載したとおり「Requests call without timeout」という警告が出てしまった為、警告の指示通り、requests の部分に timeout を設定してみることにしました。
1.修正前
修正前は、ただ「requests.get(url)」としているだけでした。
response = requests.get(url) html = response.content.decode("utf-8")
2.修正後
「requests.get(url)」としていた部分を「requests.get(url, timeout=(6.0, 10.0))」とし、タイムアウトが発生した際の例外処理を行っています。
from requests.exceptions import Timeout ・・・ # Get the HTML content of the top page try: response = requests.get(url, timeout=(6.0, 10.0)) html = response.content.decode("utf-8") except Timeout: print(f"\n[Timeout {url}]")
なお、timeout の後ろに2つ数字を書いている理由ですが、
timeoutには、connect timeout(前) と read timeout(後) の2種類がある為です。
この2種類のタイムアウトについては、以下のサイトで詳しく説明されていますのでご紹介しておきます。(ありがとうございました!)
【Python】requestsを使うときは必ずtimeoutを設定するべき(Cosnomi Blog)https://blog.cosnomi.com/posts/1259/
3.bandit 実行結果
以下が修正後の pythonプログラムに対する実行結果です。
「Test results:」が「No issues identified.」となっており、問題が解消されたことが確認できました。
% bandit test.py [main] INFO profile include tests: None [main] INFO profile exclude tests: None [main] INFO cli include tests: None [main] INFO cli exclude tests: None [main] INFO running on Python 3.8.3 [node_visitor] WARNING Unable to find qualified name for module: test.py Run started:2023-08-14 08:04:48.814175 Test results: No issues identified. Code scanned: Total lines of code: 53 Total lines skipped (#nosec): 0 Run metrics: Total issues (by severity): Undefined: 0 Low: 0 Medium: 0 High: 0 Total issues (by confidence): Undefined: 0 Low: 0 Medium: 0 High: 0 Files skipped (0): %
コメントを残す