转义变量(Escaping variables)

2019-07-03 12:59发布

我读过,这是不够的,甚至建议在输出转义字符,而不是输入。

它可以很容易地适用于所有获得变量,因为它们没有注入到从形式层面的数据库。

但是,我不知道做什么用的所有变量后做。 如果不从数据库中来,所以如果它是一个原始输入数据,转义是完全必要的。 但我使用PDO准备/执行逃避所有的变量。 现在的问题:

  1. 是否确定使用PDO的准备/执行无论是在选择和插入语句? 是不是逃避变量两次?
  2. 比方说,我打通PDO exeute声明了一些变量 - 是它确定以显示该变量简单地用$ _ POST [“变量”]没有逃脱它(如果它是在PDO功能已经完成)?
  3. 是用htmlspecialchars()足以逃避的东西,如GET不来自数据库的变量?

而最重要的 - 这一切,PDO准备/执行,并用htmlspecialchars()是,足以防止所有XSS攻击? 或者我应该也做多? 如果是的话,这应该是什么呢? 删除所有HTML标签从输入? 使用BB-代码呢?

Answer 1:

我读过,这是不够的,甚至建议在输出转义字符,而不是输入。

通常情况下,你希望:

  • 验证输入 ,并将其存储使用预处理语句。 准备的语句将保护您的数据库免受SQL注入。 通常情况下,你不想去掉HTML标签上的输入,因为这样做可能会导致数据完整性的损失。
  • 当显示用户生成的数据( 输出 ),则可以通过使用ヶ辆和mb_convert_encoding的组合防范XSS。

注意在用htmlspecialchars从功能的另一个问题 :

即使您使用的HTML标记以外用htmlspecialchars($字符串),您仍然容易多字节字符集的攻击媒介。

你可以最有效的方法是使用的组合mb_convert_encoding和ヶ辆如下。

$str = mb_convert_encoding($str, ‘UTF-8′, ‘UTF-8′);
$str = htmlentities($str, ENT_QUOTES, ‘UTF-8′);


Answer 2:

逃脱对输出字符,而不是在输入

是。

轻松适用于所有获得变量

但是$ _GET 是定义 输入

是不是逃避变量两次?

否 - 通过转义内容,你只是从错误解释通过处理代理绝缘它。 该数据库不存储转义的数据,它存储原始数据。

因此,如果开始

O'Reilly

然后逃脱它拼接成一个SQL字符串....

O\'Reilly

然后存储在数据库中,并检索SELECT语句的值

O'Reilly

而当你想输出它的HTML,那么你通过它虽然用htmlspecialchars()来获得

O"Reilly

您可以使用适当的方法取决于到哪里去逃避数据-把东西你的数据库的时候把东西转换成 HTML,因此,当您使用mysql_real_escape()或放慢参数结合或相似,并用htmlspecialchars()



Answer 3:

  1. 每当数据从用户的到来,清理动作(采取特殊照顾,如果其存储在数据库中)。 因此PDO与准备语句是必须的。 你还有什么额外的好处。

  2. 是的(意见会因人不同,在这里),以防止SQL注入(假设你使用事先准备好的声明)。 虽然我更喜欢保存的原始数据在数据库中,即使这意味着牺牲一些恶意XSS代码可能包含它。 虽然输出,需要悉心照顾。

  3. 号使用htmlpurifier (与正在从数据库输出视图)。



Answer 4:

我用mysqli_real_escape_string和的preg_replace

$email = mysqli_real_escape_string($dbc, trim($_POST['email']));
$password = mysqli_real_escape_string($dbc, trim($_POST['password']));
$domain = preg_replace('/^[a-zA-Z0-9][a-zA-Z0-9\._\-&!?=#]*@/', '', $email);

此外,这里是关于PDO逃脱类似的帖子的链接逃生论据PDO语句?



文章来源: Escaping variables