文章目录
- 接着上篇
- 项目app包下面创建static包,引入jquery,bootstrap 相关js文件
- views.py编写api
- compute文件夹下面的urls.py路由模块引入views.py刚刚定义的函数
- html发送ajax请求
接着上篇
https://blog.csdn.net/Abraxs/article/details/138739727?spm=1001.2014.3001.5501
项目app包下面创建static包,引入jquery,bootstrap 相关js文件
views.py编写api
from django.shortcuts import render
import subprocess
from django.views.decorators.http import require_POST
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
def home(request):
return render(request, 'index.html')
def run_code(code):
try:
code = 'print(' + code + ')'
output = subprocess.check_output(['python', '-c', code],
universal_newlines=True,
stderr=subprocess.STDOUT,
timeout=30)
except subprocess.CalledProcessError as e:
output = '公式输入有误'
return output
@csrf_exempt
@require_POST
def compute(request):
code = request.POST.get('code')
result = run_code(code)
return JsonResponse(data={'result': result})
这段Django的view.py文件内容包含两个函数:run_code和compute,用于处理用户提交的Python代码片段并执行它。以下是详细的分析:
run_code 函数
这个函数尝试将用户提供的code字符串包装在一个print()函数中,并使用subprocess模块在子进程中执行Python代码。如果执行成功,它将返回输出;如果执行失败(如语法错误),它将捕获subprocess.CalledProcessError异常并返回一个固定的错误消息“公式输入有误”。
存在的问题:
安全风险:直接执行用户提供的代码是极其危险的,因为它可能导致服务器被攻击者利用来执行恶意代码。
错误处理:错误消息“公式输入有误”可能不足以解释实际发生的错误,特别是当错误是由Python语法或其他非预期的问题引起时。
代码注入:如果用户提供的code包含特定的字符串(如引号),它可能会破坏print(’ + code + ')这个字符串的结构,导致语法错误或更糟糕的情况。
compute 函数
这个函数是一个Django视图,它接受POST请求,从请求中获取名为code的参数,调用run_code函数执行代码,并将结果作为JSON响应返回。
存在的问题:
CSRF保护:使用@csrf_exempt装饰器意味着这个视图不受CSRF保护。由于这个视图处理的是用户提交的代码,因此它应该受到CSRF保护,除非你有特定的理由不这样做。
权限验证:视图没有显示任何权限验证的逻辑,这意味着任何用户都可以提交代码并在服务器上执行它。
输入验证:没有对用户提供的code进行任何形式的验证或清理,这增加了安全风险。
安全建议
不要执行用户提供的代码:除非你完全理解并接受相关的安全风险,否则永远不要在生产环境中执行用户提供的代码。
使用安全的替代方案:考虑使用安全的沙箱环境(如Docker容器)或安全的代码执行库(如PyPy的sandboxing功能)来执行用户代码。
实现输入验证和清理:对用户提供的输入进行验证和清理,以防止代码注入和其他类型的攻击。
实施权限验证:确保只有授权的用户才能提交和执行代码。
启用CSRF保护:对于处理POST请求的Django视图,启用CSRF保护是一个好的安全措施。
compute文件夹下面的urls.py路由模块引入views.py刚刚定义的函数
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home'), # 首页路由
path('compute/', compute, name='compute'), # 添加针对公式计算compute的路由
]
html发送ajax请求
<script>
$('#lgbut_compute').click(function () {
$.ajax({
url: '/compute/',
type: 'POST',
data: {
'code': $('#txt_code').val()
},
dataType: 'json',
success: ShowResult
})
})
</script>