php - Controller 或模型中的 htmlspecialchars?

标签 php mysql codeigniter security

我被告知所有用户提供的输入(例如 $_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/

相关文章:

mysql - mysql查询后释放内存

php - 将默认值为空的非空列保留为空白时出现 MySQL 错误 1366

javascript - 法语 "'“在变量中阻止其呈现

php - 输出mysql结果的问题

javascript - 如何将表单中的 Json 发布到 Controller 然后保存到数据库

php - PDO "Integrity constraint violation - Duplicate entry",但表中没有重复项

php 日期和 mysql 时间戳比较

php - Mysql查询/子查询

MySQL:更新前触发不起作用

database - codeigniter 图片上传(获取加密名称)