用户数据的一个小问题

22 views
Skip to first unread message

Sam Ma

unread,
Oct 3, 2010, 1:14:51 AM10/3/10
to think...@googlegroups.com
为了防止跨站式脚本攻击,需要对用户输入的一些数据进行转义,大家是在$_GET,$_POST中处理呢,还是在页面展示的时候调用 htmlspecialchars ?

一直坚持一个观点,就是在数据库中保存的数据,是和原始数据一样的数据,所以个人倾向于在展示的时候调用 htmlspecialchars,在模板引擎中使用:

  private function htmlspecialchars($value)
  {
    if (is_string($value))
    {
      return htmlspecialchars($value);
    }
    else if (is_array($value))
    {
      foreach ($value as $key => $subValue)
      {
        $value[$key] = $this->htmlspecialchars($subValue);
      }

      return $value;
    }
    else
    {
      return $value;
    }
  }

做相关的处理。

--
Best Regards,
Sam Ma

Jingcheng Zhang

unread,
Oct 3, 2010, 1:29:28 AM10/3/10
to think...@googlegroups.com
将变量传递给模板的时候统一 htmlspecialchars。

abstract class Action {
    protected function set($key, $value) {
        $this->vars[$key] = htmlspecialchars($value);
    }
    protected function render() {
        extract($this->vars);
        require template file;
    }
    protected $vars = array();
}

$action->set('message', '<script>alert("xss");</script>');
$action->render();

模板里 echo 出某个值时,默认就已经经过了 htmlspecialchars(),因此是安全的。
如果想在模板里使用原始的未转义的数据,可以 html_entity_decode()。

因为对模板里输出的值进行转义是标准行为,所以我的方案是走白名单,而不走黑名单,这样更安全。


--
您收到这个邮件是因为订阅了 thinkinlamp 邮件组
发送邮件给 think...@googlegroups.com 就可以在本邮件组发表内容
邮件过多无从管理,请阅读使用说明:http://blog.thinkinlamp.com/?p=333
退订本邮件组,请发邮件给 thinkinlamp...@googlegroups.com



--
Best regards,
Jingcheng Zhang
Beijing, P.R.China

Jack Wang

unread,
Oct 3, 2010, 9:16:10 AM10/3/10
to think...@googlegroups.com
这样会不会增加CPU时间?

bob xia

unread,
Oct 9, 2010, 2:54:20 AM10/9/10
to think...@googlegroups.com
个人喜欢输出的时候再转义,毕竟不是所有的数据,都是需要转义的,而且可能数据在有的地方需要转义,有的地方也许又不需要转义,数据库还是保存原始数据好

在 2010年10月3日 下午9:16,Jack Wang <xiaoy...@gmail.com>写道:
这样会不会增加CPU时间?

--
您收到这个邮件是因为订阅了 thinkinlamp 邮件组
发送邮件给 think...@googlegroups.com 就可以在本邮件组发表内容
邮件过多无从管理,请阅读使用说明:http://blog.thinkinlamp.com/?p=333
退订本邮件组,请发邮件给 thinkinlamp...@googlegroups.com



--
——————
bob xia  板子
qq : 56378301
msn : xiami...@hotmail.com

Jack Wang

unread,
Oct 9, 2010, 3:56:11 AM10/9/10
to think...@googlegroups.com
为了提高性能,可以保存二份。

Sam Ma

unread,
Oct 9, 2010, 4:23:53 AM10/9/10
to think...@googlegroups.com
保存两份也太夸张了点吧,我觉得在数据库保存原始数据,然后在输出的时候,默认是使用htmlspecialchars转义的(没有性能问题),然后在不需要使用的地方(较少)使用htmlspecialchars_decode取消转义。

重申一点,这样的目的是为了保证程序的安全性,即便是有性能开销,也是值得你。

2010/10/9 Jack Wang <xiaoy...@gmail.com>
为了提高性能,可以保存二份。

--
您收到这个邮件是因为订阅了 thinkinlamp 邮件组
发送邮件给 think...@googlegroups.com 就可以在本邮件组发表内容
邮件过多无从管理,请阅读使用说明:http://blog.thinkinlamp.com/?p=333
退订本邮件组,请发邮件给 thinkinlamp...@googlegroups.com



--
Best Regards,
Sam Ma

范茹宽

unread,
Oct 9, 2010, 5:01:20 AM10/9/10
to think...@googlegroups.com
个人觉得输出的时候控制是否转义最好

Xiang Song

unread,
Oct 9, 2010, 5:37:34 AM10/9/10
to think...@googlegroups.com

如果给编辑的话只能输出转义了

在 2010-10-9 下午5:01,"范茹宽" <ilsa...@gmail.com>编写:

个人觉得输出的时候控制是否转义最好


--
您收到这个邮件是因为订阅了 thinkinlamp 邮件组
发送邮件给 think...@googlegroups.com 就可以在本邮件组发表内容

邮件过多无从管理,请阅读使用说明:...

wenly zhang

unread,
Oct 9, 2010, 11:30:42 PM10/9/10
to think...@googlegroups.com
完全同意四爷的说法。。。。

2010/10/9 bob xia <bob....@gmail.com>

Sam Ma

unread,
Oct 10, 2010, 1:16:21 AM10/10/10
to think...@googlegroups.com
数据不需要转义的地方,我遇到的有:XML格式的数据接口,提供给Flash输出显示的内容,所见即所得编辑器,其他都是要提供输出转义的。

这个过程中最麻烦的是如果开始没有做输出转义,也不会有很大的问题,但是测试随时都可以把Bug测出来,东一个西一个的,一个一个得去维护,很费成本,如果是在线上的项目,被测出来以后的维护成本会更大。

2010/10/10 wenly zhang <aden...@gmail.com>



--
Best Regards,
Sam Ma

Reply all
Reply to author
Forward
0 new messages