1
realpg 2015-08-10 10:27:25 +08:00
从旧时候过来的人,一个很喜欢注入别人程序的人,写程序时候自带防注入功能。
已经下意识的任何可能传入查询的非可控部分进行假想会被怎么注入,虽然写程序会慢一点,但是质量好。 这种意识养成后,就会逐渐进化到写啥代码想的都很多会不会有问题,写出代码需要调试DEBUG的时候就少。但是代价就是写东西会变慢,而且逐渐有强迫症写啥都追求质量速度就快不了…… |
2
realpg 2015-08-10 10:29:53 +08:00
而且跟我合作过的或者我教出来的PHP程序员,都有很好的习惯。外部数值变量进来一律intval、floatval,字符串变量任何时候带入查询不走有过滤功能的querybuilder时候一律严格处理防注
另外,曾经的公司设立过Anti Injection奖金……督促养成这个习惯 |
3
anubiskong 2015-08-10 10:35:01 +08:00
mongodb
|
4
MrJing1992 2015-08-10 10:45:20 +08:00
使用 PDOStatement 类。
|
5
jiangzhuo 2015-08-10 11:04:23 +08:00
@anubiskong 很多用mongodb的不考虑防注入的,往往是被注入的最惨的。
|
6
zhugeliang 2015-08-10 11:31:35 +08:00
php的话有很多方法可以过滤啊
|
7
incompatible 2015-08-10 11:44:38 +08:00
@realpg 我觉得你说了一大篇都没说到点子上
最好的防注入的习惯就是使用参数绑定而不是自己拼接sql |
8
tabris17 2015-08-10 11:46:59 +08:00
SQL Injection是不经过滤自行拼接SQL语句造成的,和使用什么访问接口无关
|
9
msg7086 2015-08-10 11:49:15 +08:00
就是意识问题。
有这个意识的人,就算用最原始的接口也能写出安全的代码来。 |
10
500miles 2015-08-10 11:55:39 +08:00
使用PDO 就完全可以对 sql Inject say goodbye了..
前提是 : 一定要使用参数绑定 并且声明 不要在语言层面 帮你进行解析参数,组织sql... 而是发送sql语句 和 参数变量 给mysql去处理... |
11
lijianying10 2015-08-10 11:59:14 +08:00
用stmt可好?目前我就是这么做的。
|
12
yakczh 2015-08-10 12:19:28 +08:00
不用参数绑带, $pdo->execute($params); 这样所有参数都当成字符串,会统一加上引号,有引号的会加反斜线
|
13
anubiskong 2015-08-10 13:02:07 +08:00
@jiangzhuo 你举个例子
|
14
breeswish 2015-08-10 13:30:52 +08:00
@anubiskong MongoDB 的查询是可以注入的,例如利用语言特性传一个 {$ne:xxx} 对象(而不是一个字符串)
|
15
breeswish 2015-08-10 13:31:50 +08:00
使用参数化查询就可以解决注入问题,PDO 支持参数化查询,所以,要使用 PDO 解决注入问题请使用 PDO 的参数化查询功能
|
16
anubiskong 2015-08-10 13:43:59 +08:00
@breeswish 所以说是php的问题不是mongo的?
|
17
minvacai 2015-08-10 13:53:53 +08:00
所以说用python的话只要把用户传来的内容都当字符串处理就没问题了是吧……
|
18
breeswish 2015-08-10 14:53:59 +08:00
@anubiskong 我觉得两个都没问题,对于 PHP 来说,允许传入参数转换为对象是一个有用的 feature,对于 MongoDB 来说,用这种方式查询也是个 feature…… 问题在于开发者可能会盲目地认为 MongoDB 不会有注入风险忽视了这些特性和因素——传给 MongoDB 的参数「需要」限制类型。
就像当初 SQL 那样.. 一开始大家怎么会想得到直接拼接字符串会拼出问题来呢……虽然现在看来是很显然的,不过也许当初就是大家都没意识到 |
19
jiangzhuo 2015-08-10 17:08:36 +08:00
@anubiskong cnodejs论坛好像就被注入过不止一次,因为是开源项目很快就能把漏洞补上了
|
20
jadecoder 2015-08-10 17:29:56 +08:00
我在用PDO,但是一直没明白这个能不能防宽字节注入
|
21
txlty 2015-08-10 17:50:52 +08:00
pdo->quote()
|
22
ivito OP @tabris17
@500miles 说的对,需要用参数绑定 @yakczh 其实$pdo->execute()实际上也是用的参数绑定 详情见文章: http://www.runoob.com/php/php-mysql-prepared-statements.html |
23
txlty 2015-08-10 18:07:10 +08:00
如果你用 pdo->query() 直接执行sql语句,那还是得用 pdo->quote() 把外部变量处理下。
|