2012-05-04 102 views
3

使用Tastypie清理用户输入的最有效方法是什么?现在,如果用户输入类似,HTML标记会被保存,所以当它显示时,文本显示为粗体。除了更改每个资源的obj_create之外,我将如何清理所有输入?Tastypie消毒输入?

此外,由于我是网络安全领域的新手,我是否应该在前端对用户的输入进行消毒?我不确定在发送POST请求到tastypie API之前是否应该清理输入,或者在tastypie处理输入时是否应该清理输入?

编辑:我确实发现,我可以在我的下划线模板中使用<% - %>而不是<%=%>来转义HTML。为什么不下划线默认做这个?我觉得这是一个很大的安全风险。 如果我不小心忘了在某个地方做这个,那么我就搞砸了。

我认为上述问题解决了前端安全问题,但是后端呢?有没有办法可以看到我是否容易受到SQL注入?当我执行POST/PUT请求时,tastypie会对输入进行消毒吗?

回答

1

永远永远不会将不可信的用户输入呈现给浏览器。在浏览器中看到的唯一方法是输出过滤器上有|safe。不要这样做。不要在模型中将属性设置为mark_safe = True。

+0

通过过滤|安全,你是指Django模板?我没有使用Django模板来渲染我的模型。我正在使用下划线模板。另外,在模型中我没有mark_safe = True,那么HTML标签是如何经历的呢?我会明白,如果下划线不逃避HTML,但不会Django不存储HTML标签? – egidra

+0

没有关于上述评论。我编辑了原文。 – egidra

+0

我支持我的评论。默认情况下,Django永远不会显示不安全的内容。在将数据存入数据库之前,我不会改变输入,我只是不会显示它。很高兴知道这是坏的默认值,而不是我们! :)由于不安全的输入导致django核心或tastypie中没有已知的SQL注入漏洞。在调用SQL之前,我们正确地转义了事情 –

0

我添加了脱水方法的资源,它改写它的方式的危险领域的浏览器,像这样:

def dehydrate(self, bundle): 
    bundle.data['field_to_sanitize'] = bundle.data['field_to_sanitize'].replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace("'", "&#39;").replace('"', "&quot;") 
    return bundle 

现在,这是不是最好的解决方案,但它会逃跑许多最危险的实体。如果你有方便的htmlescape功能,你可以使用它。