防止 xss 和 sql 注入而进行非法字符过滤, js 前端有什么几乎一劳永逸的方式?

2020-04-24 14:58:09 +08:00
 tctc4869

网上有各种防止 xss 和 sql 注入的方案,前端的也有,后端的也有。各种方案太多太杂,看的我头疼。

我的策略是,前端负责非法字符的过滤,转换,显示,让过滤后的安全数据入库,以及能安全的显示给用户看。而后端处理非法字符,就很简单。一旦检测到非法字符就直接返回 404,403,400 等错误码。

那么问题来了,先不考虑富文本,就那种普通的文本框,假设每个用户用浏览器操作,在输入框里输入的内容中,都可能带有 sql 注入,xss 攻击所用的代码的一段文字或文章例,前端如何负责这些带有非法字符的过滤转换?让数据能安全的入库,然后在数据显示时,又能显示用户输入时的样子,又不出问题呢。

13697 次点击
所在节点    JavaScript
148 条回复
ipwx
2020-04-24 15:03:41 +08:00
首先,sql 注入很好解决。用 prepared statement 就行。而且 prepared statement 比 sql 直接塞值更高效。另外,大部分 ORM 都能有效利用各种机制防止注入。

其次,对于 XSS 。如果你不在后端检查,那么攻击者总能构造出让你能入库并原样返回给前端的内容。除非你前端是在显示内容的最后一步之前进行处理,在提交的时候过滤是无效的。当然,如果你前端在最后一步显示之前处理 XSS 的内容,那么后端可能不需要任何检查,也不需要什么 404 之类的状态吗。结合第一条的解决方案,正常入库出库就行。

但是对于用户体验而言,每次显示前处理 XSS 无疑会占用 CPU 资源。还不如你后端入库进行处理呢。
lneoi
2020-04-24 15:05:22 +08:00
前后端都得做处理
前端有一个库,刚搜了下,这是官网 https://jsxss.com
tctc4869
2020-04-24 15:13:05 +08:00
@lneoi 谢谢
MOETAN0
2020-04-24 15:17:03 +08:00
后端必需处理。
xss 攻击者可不会老老实实在你的输入框里填脚本,构造一个 post 请求就可以绕开在 js 上的处理。
est
2020-04-24 15:17:40 +08:00
一劳永逸很简单啊。把所有用户输入过滤成 [a-zA-Z0-9]。一次过滤不成过滤 2 次 。
dilu
2020-04-24 15:22:28 +08:00
sql 注入就不说了 1l 方案完全没问题

至于 xss php 有内置函数,直接转换所有 html 标签为实体标签,也可以直接去掉全部 html 标签

一句话,php 专为 web 而生 香
Leon6868
2020-04-24 15:23:06 +08:00
前端基本防不住
你要后端处理才行
tctc4869
2020-04-24 15:25:07 +08:00
@MOETAN0 我的后端不是不处理,而是处理比较简单粗暴,在后端,把检测到带有的非法字符的请求返回个 404,403 之类的错误码,把别有用心的构造请求的攻击者挡在外面。
tctc4869
2020-04-24 15:28:54 +08:00
@Leon6868 看清楚啊,我并不是说后端不处理,只是前端已经过滤了,就代表已经是安全的了,没有必要在后端再来一次过滤,而后端处理就比较简单,不用搞过滤等操作,把检测到非法字符的请求返回个如 404 错误或无用的信息给攻击者。
moonlord
2020-04-24 15:29:03 +08:00
SQL 注入的一劳永逸,就是 不硬拼 SQL,只用 prepared statement,参数和语句分离开

XSS 注入的一劳永逸,就是 不操作 html,只操作 txt
认为 用户输入、后端返回 的数据必须是文本,而不是网页的一部分
也就是不用 JS 的 innerHTML, jQuery 的 html()
只用 JS 的 innerText (IE) 和 textContent (Firefox), jQuery 的 text(),毛的注入都不存在了

其余所有什么 检验、转码 都是辣鸡方法,过时的,误导新人的
我就想用<script>当名字,你就给我显示<script>就完了,不要扯别的,瞎折腾

=。=
https://segmentfault.com/q/1010000004067521
http://www.moonlord.cn
gz911122
2020-04-24 15:30:54 +08:00
@tctc4869 前端已过滤并不能代表已经是安全的了
msg7086
2020-04-24 15:32:36 +08:00
用 ORM 的我已经很多年没有考虑过注入问题了。你随便构造数据,我什么都不过滤,能注入算我输。
napsterwu
2020-04-24 15:34:27 +08:00
xss 一劳永逸就是加入 csp 报文头,并且拒绝用户使用 ie
moonlord
2020-04-24 15:35:11 +08:00
@Leon6868 前端防不住?是你太菜吧,你告诉我什么场景前端防不住?
tctc4869
2020-04-24 15:37:13 +08:00
@gz911122 我知道,我其实想说的是,后端搞过滤是多此一举,后端不要搞什么过滤,只搞检查同步通不通过就行,过滤转码交给前端就行,直接构造请求的攻击者,肯定不会乖乖用浏览器,这些,直接交给后端用拦截器拦下来返回错误码即可,这是我的策略。
TangMonk
2020-04-24 15:41:01 +08:00
@moonlord #14 前段的代码可以随意更改的
fancy111
2020-04-24 15:47:50 +08:00
@moonlord 你怕不是逗,前端能防个什么?你发个链接来防给我看看
moonlord
2020-04-24 15:48:17 +08:00
@TangMonk
我不会用 Chrome 控制台吗?需要你说?所以呢?和 XSS 有什么关系?
moonlord
2020-04-24 15:49:04 +08:00
@fancy111 看 10 楼,你先百度 XSS 再说话好嘛
whoami9894
2020-04-24 15:49:13 +08:00
XSS 的话,一般情况下对所有符号(`<>"&#`)进行 HTML encode 基本就没问题了,比如 PHP 的 htmlspecialchars 函数。
不过总有一些特殊场景,还是需要开发者有足够经验,比如标签内的输出点:`<a href="javascript:\u0061\u006c\u0065\u0072\u0074(1);">click</a>`

当然 CSP 也是好办法,但一样有不少绕过方式。国内外 SRC 上经常有大厂被挖出 XSS,想一劳永逸解决?不存在的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/665687

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX