我被告知所有用户提供的输入(例如 $_GET 变量)必须通过 xss 过滤和 htmlspecialchars 以防止数据库攻击。但我不知道哪个是最好的,将过滤放在 Controller 或模型中?我希望我不会再次进行微优化...
最佳答案
恐怕你把事情搞混了。
为了防止“数据库攻击”(我想你指的是 SQL 注入(inject)),你必须使用参数化查询(使用类似于 php 中的 PDO 的东西)。关于 SO 的一些很好的问题可以帮助 prevent SQL injection in PHP .
但这与XSS和htmlspecialchars()
无关。
XSS 是指攻击者能够将 Javascript 代码注入(inject)应用程序页面。如果可以通过任何形式的用户输入实现,则该页面容易受到 XSS 攻击。
这是一个很大的话题,但简而言之,XSS 是一个输出问题,而有助于防止它的解决方案是输出编码。它可能有多种形式,基本的 html 编码由 PHP 中的 htmlspecialchars()
完成,但还有更多,例如在将变量写入 Javascript 上下文时(在脚本标记之间) ,进入事件属性等)。然后我们还没有提到 DOM XSS,当整个事情发生在 Javascript 中而没有一个服务器往返时。
此处不适合提供有关防止 XSS 的完整教程。
但是,让我记下与您的问题密切相关的一些内容。在将用户输入写入数据库之前,您不应对其进行编码。如果您存储编码数据,那么一方面搜索/排序会更加困难,因为编码字符会把它们弄乱。这也是一个关注点分离,你的模型与呈现数据无关,编码是呈现逻辑。当你的数据存储在数据库中时,你甚至不知道它会在什么上下文中呈现,所以你甚至无法选择正确的编码方式(html 编码?javascirpt 编码?xml 或 json 或 ldap?你的数据最终会去哪里? ?)。
因此您可以按接收到的形式存储它(很明显,通过使用参数为 SQL 查询正确地转义它),然后在实际生成输出时关心 View 中的输出编码。
关于php - Controller 或模型中的 htmlspecialchars?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40758772/