我被告知所有用户提供的输入(例如$ _GET变量)必须通过xss过滤和htmlspecialchars来防止数据库攻击。但我不知道哪个最好,将过滤放在控制器或模型中?我希望我不会再次进行微观优化......
答案 0 :(得分:2)
你害怕混在一起。
为了防止“数据库攻击”(我认为你指的是SQL注入),你必须使用参数化查询(在php中使用类似PDO的东西)。有很多关于SO的问题对prevent SQL injection in PHP有帮助。
但这与XSS和htmlspecialchars()
没有任何关系。
XSS是关于攻击者能够将Javascript代码注入应用程序页面的。如果通过任何形式的用户输入都可以实现,则该页面易受XSS攻击。
这是一个很大的话题,但在很短的时间内,XSS是一个输出问题,有助于防止它的解决方案是输出编码。它可能有很多形式,基本的html编码由PHP中的htmlspecialchars()
完成,但还有更多,例如在将变量写入Javascript上下文(脚本标记之间,事件属性,等等)。然后我们没有提到DOM XSS,当整个事情发生在没有单个服务器往返的Javascript中时。
关于防止XSS的完整教程不适合这里的答案。
但是,请允许我注意与您的问题密切相关的内容。在将用户输入写入数据库之前,不应对其进行编码。如果你存储编码数据,那么一方面它将更难搜索/排序,因为编码的字符会搞砸那些。它也是一个关注点分离的东西,你的模型与呈现数据无关,而编码是表示逻辑。将数据存储在数据库中时,您甚至不知道它将在何种上下文中显示,因此您甚至无法选择正确的编码方法(html编码?javascirpt编码?xml或json或ldap?您的数据将在何处结束?)。
所以你可以按原样存储它(显然可以通过使用参数正确地将它转换为SQL查询),然后在视图中关注输出编码,当实际输出时。
答案 1 :(得分:1)
我个人会创建一个包含这样功能的辅助类,可以在需要的地方实例化,或者包含这些功能的控制器的抽象类或特征。
您还应该确保数据库模型正在使用预准备语句或PDO,并且您还可以在模型抽象类中包含更高级别的过滤/清理。
答案 2 :(得分:1)
我喜欢在模型中,结果之后。
一旦结果准备就绪,我想修改结果对象,日期格式,字符集和其他值,这样可以返回一个干净的对象。
肥胖模特,超薄控制器。