这对我简单的webapp来说是否足够的验证/清理?

时间:2012-07-23 22:55:51

标签: python web-applications security

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

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

第二个输入size必须是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)

我感谢你们所有的建议。

2 个答案:

答案 0 :(得分: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)

请注意,验证和清理输入仍然非常非常重要。

答案 1 :(得分:0)

这段代码闻起来很糟糕。您对如何执行规则非常不清楚。你的代码完全缺乏抽象。

NO POINT 在执行安全性验证检查时,是否应使用try / catch all块。除非捕获特定的异常类型,否则您不知道为什么操作可能会失败。对于所有用户数据,您应该能够检查类型,执行强制转换,检查值的范围而不抛出异常。此外,您应该使用单个方法来显示错误页面。

  

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

     

- 布鲁斯施奈尔