0

まず、私は Web 開発の初心者です。ユーザー入力を受け入れる 2 つのテキスト フィールドを持つ単純な mod_wsgi webapp を作成しています。

最初の入力 nnodes は、0 ~ 30 の整数でなければなりません。

2 番目の入力であるサイズは、0 ~ 20 の整数または浮動小数でなければなりません。

これまでにスクリプトで行った検証/サニタイズは次のとおりです。スクリプトの後半で入力リダイレクトをどのように使用するかを見て、重大な悪意のある脅威の影響を受けやすいかどうかについて誰かがコメントできることを期待していました。

    nnodes = escape(nnodes)
    size = escape(size)

    if nnodes.isdigit() and int(nnodes) in range(31):
        pass
    elif nnodes=='':
        response_body=html % ' '
        status='200 OK'
        response_headers = [('Content-Type', 'text/html'),('Content-Length',str(len(response_body)))] 
        start_response(status, response_headers)
        return [response_body]
    else:
        response_body=html % 'Please enter the number of malignant nodes as a whole number between 0 and 30.'
        status='200 OK'
        response_headers = [('Content-Type', 'text/html'),('Content-Length',str(len(response_body)))] 
        start_response(status, response_headers)
        return [response_body]

###Validate that the tumorsize is a float between 0-25. 
    try:
        size=='' or float(size)
        pass
    except:
        response_body=html % 'Please enter the tumor size as a number between 0 and 25.'
        status='200 OK'
        response_headers = [('Content-Type', 'text/html'),('Content-Length',str(len(response_body)))] 
        start_response(status, response_headers)
        return [response_body]

    if 0<=float(size)<=25:
        pass
    elif size=='':
        response_body=html % ' '
        status='200 OK'
        response_headers = [('Content-Type', 'text/html'),('Content-Length',str(len(response_body)))] 
        start_response(status, response_headers)
        return [response_body]
    else:
        response_body=html % 'Please enter the tumor size as a number between 0 and 25.'
        status='200 OK'
        response_headers = [('Content-Type', 'text/html'),('Content-Length',str(len(response_body)))] 
        start_response(status, response_headers)
        return [response_body]

###After the validation, I use input redirection to pass the input to an R script.  I know this is not optimal but I can't get the Rpy2 module to work on my server.  
###I also know that input redirection can open an app up to shell injection, but that is why I am asking you all if I've done sufficient validation and sanitization.

commandString="/home/usr/bin/R --no-save --quiet --slave --args " + str(nnodes) + " " + str(size) + " </home/usr/webapps/simple/htdocs/webcalc.R"
subprocess.call(commandString,shell=True)

皆さんからのアドバイスに感謝します。

4

2 に答える 2

0

「ユーザーを決して信用しない」は十分な理由です。しかし、「プログラマーを信用してはならない」というのは、もう 1 つの有効な格言です。検証とサニタイズ ルーチンは鉄壁だと思うかもしれませんが、悪意のある入力を可能にする微妙なバグが存在する可能性があります。転ばぬ先の杖。

マンページからRインタープリターについてもう少し見つけました。どうやら、入力ファイルを指定できる -f 引数があるようです。したがって、このすべてを修正できます。

# Split out the filename for easier refactoring
r_script = '/home/usr/webapps/simple/htdocs/webcalc.R'
# We can give an iterable to subprocess.call()
command_args = ['/home/usr/bin/R', '-f', r_script, '--no-save', '--quiet', '--slave', '--args', str(nnodes),
    str(size)]
# And since we don't need shell features like '<', shell=True goes away!
subprocess.call(command_args)

入力を検証してサニタイズすることは依然として非常に重要であることに注意してください。

于 2012-07-24T00:10:39.817 に答える
0

このコードはひどいにおいがします。ルールをどのように実施しているかについて、あなたは非常に不明確です。あなたのコードには抽象化が完全に欠けています。

セキュリティの検証チェックを実行するときに、try/catch all ブロッ​​クを使用する必要はありません特定の例外の種類をキャッチしない限り、操作が失敗する理由はわかりません。すべてのユーザー データについて、型をチェックし、キャストを実行し、例外をスローすることなく値の範囲をチェックできる必要があります。また、エラー ページを表示するには、1 つの方法を使用する必要があります。

複雑さはセキュリティの最大の敵です。

――ブルース・シュナイアー

于 2012-07-24T03:51:17.300 に答える