0

首先,我是 Web 开发的新手。我正在制作一个简单的 mod_wsgi webapp,它有两个文本字段来接受用户输入。

第一个输入 nnodes 必须是 0-30 之间的整数。

第二个输入,大小,必须是整数或介于 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

“永远不要相信用户”就足够了。但是“永远不要相信程序员”是另一个有效的格言。即使您可能认为您的验证和清理程序是铁定的,也可能存在一个微妙的错误,可能允许恶意输入通过。安全总比后悔好。

我从手册页中找到了更多关于 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 块。除非您捕获特定的异常类型,否则您不知道为什么操作可能会失败。对于所有用户数据,您应该能够检查类型、执行强制转换、检查值的范围而不会引发异常。此外,您应该使用单一方法来显示错误页面。

复杂性是安全的最大敌人。

——布鲁斯·施奈尔

于 2012-07-24T03:51:17.300 回答