PHP 对输入过滤是不是 htmlspecialchars 就够了? (不考虑 SQL 注入, PDO prepare 已经解决)

2017-05-20 12:59:10 +08:00
 xiaoyanbot

安全编码方面,SQL 注入由 PDO prepare 来解决, 是不是 防范安全方面,XSS 攻击什么的,是不是用 htmlspecialchars 就够了?

比如对 $_GET 的处理:

function get($name){
    
    return htmlspecialchars($_GET["$name"]);
    
}

这样处理后,还会有什么输入的漏洞吗? 还是说强制转 string 什么的更安全呢?

4087 次点击
所在节点    PHP
18 条回复
xiaoyanbot
2017-05-20 13:20:01 +08:00
xss
sagaxu
2017-05-20 13:40:25 +08:00
这是很糟糕的做法,除了 htmlspecialchars,还得有 xml_specialchars,regex_specialchars,database_specialchars 等等,在入口处统一过滤或者转义,是简单粗暴很 low 的做法,它在让你丢失原始数据的同时,并没有真正避开危险。
nobird
2017-05-20 13:49:02 +08:00
@sagaxu 那什么样的才是合适的方法呢?
changwei
2017-05-20 13:50:23 +08:00
@sagaxu 都已经做了实体编码,xml 的尖括号也没用了,还怎么 xml 注入呢?有点好奇啊,正则表达式注入,这个场景很少见吧,一般不会把用户输入的字符串作为正则表达式带入吧。
aawei
2017-05-20 13:53:39 +08:00
@sagaxu 我一直以为在入口处做过处理就不会有问题,那请问一下这种做法简单粗暴,那有啥比较优雅的方式处理才能避免 SQL 注入和 xss 呢??
wangjie
2017-05-20 13:53:43 +08:00
@sagaxu #2 求教正确的做法是什么
sagaxu
2017-05-20 14:02:15 +08:00
@aawei 保持原始数据的传递,在消费数据的地方,按照消费方的方式去转义
1762628386
2017-05-20 14:29:33 +08:00
@sagaxu 正解啊 保持原始数据
xiaoyanbot
2017-05-20 15:03:53 +08:00
@sagaxu 按照消费方的方式去转义? 意思是不用处理,SQL 的时候,直接 prepare 解决; 在需要什么数据的时候,用 ( string ) 这种强制转义吗?
xiaoyanbot
2017-05-20 15:05:39 +08:00
@sagaxu 已经做了 htmlspecialchars , 为什么还需要 xml_specialchars,regex_specialchars,database_specialchars

后面这三个,有什么是 htmlspecalchars 没有过滤掉的危险字符呢? 能帮忙举个例子吗? 谢谢
HYSS
2017-05-20 15:21:35 +08:00
Pdo prepare 的预处理完全能避免 sql 攻击
htmlspecialchars 用于将显示的时候转义实体字符避免 xss

附上一篇关于 pdo 预处理为什么能防止 sql 攻击的文章

http://www.cnblogs.com/LoveJenny/archive/2013/01/15/2860553.html
zjsxwc
2017-05-20 15:21:43 +08:00
是的,肯定够了。但是我们还是有需求保留安全的 html 文本,比如不把图片 img 标签给过滤掉,而对有危险的比如 script 标签、onclick 属性文本过滤,而不是一刀切全部干掉。
shiji
2017-05-20 16:17:08 +08:00
PDO prepare 并不能百分百防止注入。
1. 要统一好整个网站,web 服务器,数据库的编码。
2. $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 要记得设置
3. 注意二级注入。比如用户把带危险的字符串先存进数据库,如果你想在另外一个 SQL 语句里 concat 或者直接拼接那个带危险的字符串,是可以注入的。

至于 XSS,:
http://stackoverflow.com/questions/19584189/when-used-correctly-is-htmlspecialchars-sufficient-for-protection-against-all-x

ajax 的话用.text(data)也是安全的
mcfog
2017-05-20 16:45:25 +08:00
a.输入过滤是错误的做法,正确的做法是在输出的时候按照不同的位置进行相应的合适的处理(不仅限于后端)
b.htmlspecialchars 不带参数的时候仅适用于 html 标签内容
c.prepare 的问题#13 基本讲了
d.常见的还需要覆盖的有 csrf、cookie 的种种安全问题,session 的种种安全问题,密码安全等
e.你得先知道怎么攻击才能真正知道怎么防御,很多程序员的问题在于,说起安全都能说要做 123 (当然楼主连 123 都没说对说全),但为啥要做,不做会被怎么攻击都讲不清楚,这就有很大风险会导致作出徒有其表的防御
f.要讲安全,建议先通读 owasp cheatsheet 系列
mingyun
2017-05-20 19:26:41 +08:00
@mcfog nice
GoBeyond
2017-05-20 21:25:23 +08:00
听说自带的那个过滤的不严
lslqtz
2017-05-21 04:34:01 +08:00
自我觉得完全够用。在全部的地方过滤即可。
当你不需要原始数据时,你可以过滤后放入,对性能优。
当你需要原始数据时,你可以取出后过滤输出。
cszchen
2017-05-21 10:22:33 +08:00
防注入,pdo 的 prepare 足矣,不用做其他处理
防 xss,是在把用户输入的内容渲染到 html 的时候要转义

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

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

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

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

© 2021 V2EX