我读过,这是不够的,甚至建议在输出转义字符,而不是输入。
它可以很容易地适用于所有获得变量,因为它们没有注入到从形式层面的数据库。
但是,我不知道做什么用的所有变量后做。 如果不从数据库中来,所以如果它是一个原始输入数据,转义是完全必要的。 但我使用PDO准备/执行逃避所有的变量。 现在的问题:
- 是否确定使用PDO的准备/执行无论是在选择和插入语句? 是不是逃避变量两次?
- 比方说,我打通PDO exeute声明了一些变量 - 是它确定以显示该变量简单地用$ _ POST [“变量”]没有逃脱它(如果它是在PDO功能已经完成)?
- 是用htmlspecialchars()足以逃避的东西,如GET不来自数据库的变量?
而最重要的 - 这一切,PDO准备/执行,并用htmlspecialchars()是,足以防止所有XSS攻击? 或者我应该也做多? 如果是的话,这应该是什么呢? 删除所有HTML标签从输入? 使用BB-代码呢?
我读过,这是不够的,甚至建议在输出转义字符,而不是输入。
通常情况下,你希望:
- 验证输入 ,并将其存储使用预处理语句。 准备的语句将保护您的数据库免受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′);
逃脱对输出字符,而不是在输入
是。
轻松适用于所有获得变量
但是$ _GET 是定义 输入
是不是逃避变量两次?
否 - 通过转义内容,你只是从错误解释通过处理代理绝缘它。 该数据库不存储转义的数据,它存储原始数据。
因此,如果开始
O'Reilly
然后逃脱它拼接成一个SQL字符串....
O\'Reilly
然后存储在数据库中,并检索SELECT语句的值
O'Reilly
而当你想输出它的HTML,那么你通过它虽然用htmlspecialchars()来获得
O"Reilly
您可以使用适当的方法取决于到哪里去逃避数据-把东西到你的数据库的时候把东西转换成 HTML,因此,当您使用mysql_real_escape()或放慢参数结合或相似,并用htmlspecialchars()
我用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语句?