转义变量

use*_*069 2 php security xss escaping

我已经读过它足够甚至建议在输出上转义字符,而不是输入.

它可以很容易地应用于所有get变量,因为它们不会从表单级别注入数据库.

但是,我不确定如何处理所有后期变量.如果它不是来自数据库,那么如果它是原始输入数据,则完全需要转义.但我正在使用PDO prepare/execute来逃避所有变量.现在问题:

  1. 是否可以在select和insert语句中使用PDO准备/执行?是不是两次逃避变量?
  2. 假设我通过PDO exeute语句得到一些变量 - 是否可以使用$ _POST ['variable']显示这个变量而不转义它(如果已经在PDO函数中完成)?
  3. htmlspecialchars()是否足以转义不是来自数据库的GET变量?

最重要的是 - 所有这些,PDO准备/执行,以及htmlspecialchars(),足以防止所有XSS攻击?或者我也应该做更多?如果是这样,那应该是什么?从输入中删除所有html标签?使用BB-Code代替?

Way*_*tty 9

我已经读过它足够甚至建议在输出上转义字符,而不是输入.

通常,您希望:

  • 验证输入并使用预准备语句存储它.准备好的语句将保护您的数据库免受SQL注入.通常,您不希望在输入上删除HTML标记,因为这样做可能会导致数据完整性丢失.
  • 显示用户生成的数据(输出)时,可以使用htmlentities和mb_convert_encoding的组合来防范XSS.

关于来自另一个问题htmlspecialchars函数的注意事项:

即使您在HTML标记之外使用htmlspecialchars($ string),您仍然容易受到多字节字符集攻击向量的攻击.

最有效的方法是使用mb_convert_encodinghtmlentities的组合, 如下所示.

$str = mb_convert_encoding($str, ‘UTF-8?, ‘UTF-8?);
$str = htmlentities($str, ENT_QUOTES, ‘UTF-8?);
Run Code Online (Sandbox Code Playgroud)