安全、方便地清理用户输入和输出的真正方法是什么?


What is the real way to sanitize user input and output safely and conveniently

安全性应该永远是首先要考虑的,对吗?我觉得这个问题很重要,早该有人问了,但是我在搜索结果中没有找到满意的答案。

我需要将用户的文章内容存储在数据库中并安全地输出。但是有很多方法可以做到这一点。我可以使用filter_var(), strip_tags(), mysql_real_escape_string(), stripslashes()等来做到这一点。我不能选择一种来使用,我也不能确定使用其中一种是否足够安全。

净化输入和输出的最佳实践是什么?

简单:不要过滤输入。逃避输出。

  • 当你在MySQL查询中使用MySQL扩展名时,使用mysql_real_escape_string。(更好的是,切换到PDO并使用预处理语句。)
  • 当你在HTML页面中打印内容时,使用htmlspecialchars
  • 当你在shell命令中放入一些东西时,使用escapeshellcmd/escapeshellarg
  • url使用urlencode

用非常简单的术语来说就是"为输出上下文转义/编码"。这就是它的全部。

当你想在mysql中存储一些东西时,你正在生成一个mysql语句。上下文:mysql语句。对mysql语句进行编码/转义,可以使用准备好的语句,或者使用PDO适配器实例引用数据,或者使用mysql_real_escape_string(作为最后的手段)。

当你想在HTML页面中输出一些东西时,Context: HTML data。使用htmlspecialchars对HTML进行编码,但要注意,htmlspecialchars对HTML属性来说并不足够,因为在这种上下文中也需要对空格进行编码,就像这两种引号一样。

请记住,css和javascript都是它们自己的上下文——不要像对待HTML那样对待它们。