Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 允许用户创建MySQL筛选器时,请逃逸危险代码_Jquery_Mysql_Django_Json_Filter - Fatal编程技术网

Jquery 允许用户创建MySQL筛选器时,请逃逸危险代码

Jquery 允许用户创建MySQL筛选器时,请逃逸危险代码,jquery,mysql,django,json,filter,Jquery,Mysql,Django,Json,Filter,我目前可以显示数据库中所有电影的所有发行年份。用户可以选择一年,观看该年发行的所有电影。或者我可以展示所有类型的电影。用户可以选择一种类型并观看符合该标准的所有电影。我构建了一个表单,用户可以在其中动态选择自己的标准。例如,“发布日期”在“2000”之后,将返回一个过滤列表 我编写了一些不受保护的jquery/django代码来向数据库传递过滤器。通过下拉框和用户输入框的组合(与您在iTunes中看到的完全相同),我使用jquery构建过滤器 例如,假设用户在第一个下拉列表中选择“年”。对于第二

我目前可以显示数据库中所有电影的所有发行年份。用户可以选择一年,观看该年发行的所有电影。或者我可以展示所有类型的电影。用户可以选择一种类型并观看符合该标准的所有电影。我构建了一个表单,用户可以在其中动态选择自己的标准。例如,“发布日期”在“2000”之后,将返回一个过滤列表

我编写了一些不受保护的jquery/django代码来向数据库传递过滤器。通过下拉框和用户输入框的组合(与您在iTunes中看到的完全相同),我使用jquery构建过滤器

例如,假设用户在第一个下拉列表中选择“年”。对于第二个下拉列表:“是”。最后是一个输入框,用户在其中输入“2005”。此条件被放入一个数组中:

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)