Jquery 允许用户创建MySQL筛选器时,请逃逸危险代码
我目前可以显示数据库中所有电影的所有发行年份。用户可以选择一年,观看该年发行的所有电影。或者我可以展示所有类型的电影。用户可以选择一种类型并观看符合该标准的所有电影。我构建了一个表单,用户可以在其中动态选择自己的标准。例如,“发布日期”在“2000”之后,将返回一个过滤列表 我编写了一些不受保护的jquery/django代码来向数据库传递过滤器。通过下拉框和用户输入框的组合(与您在iTunes中看到的完全相同),我使用jquery构建过滤器 例如,假设用户在第一个下拉列表中选择“年”。对于第二个下拉列表:“是”。最后是一个输入框,用户在其中输入“2005”。此条件被放入一个数组中:Jquery 允许用户创建MySQL筛选器时,请逃逸危险代码,jquery,mysql,django,json,filter,Jquery,Mysql,Django,Json,Filter,我目前可以显示数据库中所有电影的所有发行年份。用户可以选择一年,观看该年发行的所有电影。或者我可以展示所有类型的电影。用户可以选择一种类型并观看符合该标准的所有电影。我构建了一个表单,用户可以在其中动态选择自己的标准。例如,“发布日期”在“2000”之后,将返回一个过滤列表 我编写了一些不受保护的jquery/django代码来向数据库传递过滤器。通过下拉框和用户输入框的组合(与您在iTunes中看到的完全相同),我使用jquery构建过滤器 例如,假设用户在第一个下拉列表中选择“年”。对于第二
dictionary:
[
{"includes": [["year__iexact", "2005"]],
"excludes": []},
"all"
]
“includes”/“excludes”将“is”、“is before”等标准与“is not”等标准分开“全部”表示筛选器应“全部匹配”,而不是“任何匹配” 这将转换为JSON:
[{"includes":[["year__iexact","2005"]],"excludes":[]},"all"]
并张贴到django
django中的视图然后将数据放入过滤器:
incdict[ filter[0].encode('utf-8') ] = filter[1].encode('utf-8')
这就变成了:
incdict[ 'year__iexact' ] = 2005
输入到查询中(按照说明:
好的,我希望这是清楚的。我现在要问的是如何保护那些试图绕过/利用输入的不择手段的用户。我需要转义特殊字符吗?数据验证?保护系统的最佳方法是什么?我会验证输入,而您必须在服务器端进行验证
如果您在“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,无法从他们那里创建危险的查询;查询类型由调用的方法决定,而不是由传递的数据决定。即使用户无法执行任何明显的恶意查询(删除或获取机密数据),您也可能不得不担心有人经常用复杂的查询访问您的数据库(考虑多个连接和一些正则表达式或非索引列上的其他选择),这些可能需要很长时间才能回答
这还取决于数据库的大小,它一次可以处理多少复杂的查询,但这可能会使您的网站速度变慢。与此问题无关,但同样重要的是要注意确保不包含任何敏感数据(例如用户的私人数据)在你的JS文件中。我应该在这方面没问题。“年”和“iexact”部分仅通过下拉菜单提供。只有实际的文本框/用户输入才允许任何手动筛选标准。我想这在本文中是一个没有实际意义的问题-因为Ignacio指出安全性在这里不是问题-但您不能依赖任何客户端。使用Firebug之类的工具,用户可以更改点击几下就可以看到你的下拉菜单。这是一个很好的观点,也是我没有意识到的。我以后会注意这一点。注意到。我不知道如何应对。为了避免这种行为,我将过滤器的数量限制为6个。我想我只需要根据我看到的内容进行调整。
query_set = Film.objects.filter(**incdict)