安全性应该永远是首先要考虑的,对吗?我觉得这个问题很重要,早该有人问了,但是我在搜索结果中没有找到满意的答案。
我需要将用户的文章内容存储在数据库中并安全地输出。但是有很多方法可以做到这一点。我可以使用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那样对待它们。