0

我需要在这里检查一些东西,我知道它们会过滤掉一些代码,因为输入是在一行代码中获得的,这里我在获得代码后按顺序完成了它,这是否也可以接受?还是我必须想办法在一行中过滤和转义数据,同时获取数据?这是我正在谈论的内容的示例...

  // Get data and prevent XSS attack
  $user = htmlentities($_POST['email'], ENT_QUOTES, 'UTF-8');
  $pass = htmlentities($_POST['pass'], ENT_QUOTES, 'UTF-8');

  // MySQL Injection prevention
  $userdata = mysql_real_escape_string($user);
  $passdata = mysql_real_escape_string($pass);

想法?

我在这里试图实现的关键目标是逃避 MySQL 注入尝试并防止 XSS 攻击

4

3 回答 3

2

我在这里试图实现的关键目标是逃避 MySQL 注入尝试并防止 XSS 攻击

你不能同时做这两个。

SQL 转义需要在您创建包括文本字符串的 SQL 查询时发生。尽管您最好使用参数化查询(例如 mysqli 或 PDO),以便不必担心。

HTML 转义需要在您创建包含文本字符串的 HTML 标记时进行。尽管在理想情况下,您将使用默认情况下 HTML 转义的模板语言,因此您不必担心。

如果您在输入阶段而不是它们各自的输出阶段同时应用 HTML 转义和 SQL 转义,您将在数据库中获得 HTML 编码的数据,您将无法对(搜索、子字符串)应用一致的文本处理等),并且您将获得 SQL 编码的数据吐出到该值尚未经过数据库 I/O 周期的页面上(O\\\\\\\\'Reilly问题的原因。另外,您仍然会面临任何数据的风险没有经过输入路径——例如从数据库中获取一个字符串,处理它并将它返回到数据库,它不会有一个转义步骤,你又容易受到 SQL 注入的攻击。

两种转义方案都不适合一揽子应用到输入。输入过滤应该用于阻止您不想处理的字符并执行业务规则。仅在将文本内容移动到新上下文时才进行输出转义 - 并尽可能使用防止您此时必须手动转义的框架。

于 2012-07-10T08:13:49.373 回答
1

使用是不够mysql_real_escape_string的。在某些情况下,可以利用无效的多字节编码来注入 SQL 攻击(与 不同addslashes,这种类型的攻击mysql_real_escape_string只有在连接字符串中的字符编码被覆盖时才会发生)。

在与 MySQL 交互时,您还应该使用准备好的语句。

关于 XSS,可以考虑集成HTML Purifier

HTML Purifier 是一个用 PHP 编写的符合标准的 HTML 过滤器库。HTML Purifier 不仅会使用经过全面审核、安全且允许的白名单删除所有恶意代码(更广为人知的 XSS),它还将确保您的文档符合标准,这只有在全面了解 W3C 规范的情况下才能实现。

于 2012-07-10T04:42:40.260 回答
0

我更喜欢使用函数来传递我的所有字符串。

function safe($value){ 
return mysql_real_escape_string($value);
}

如果我想收集输入,我会这样做:

$name=safe($_POST['name']);
于 2013-11-10T07:54:03.740 回答