不能在带有数组的foreach循环中使用htmlspecialchars,为什么?

时间:2018-06-07 10:51:12

标签: php arrays string xss htmlspecialchars

我正在处理一些安全问题,而php正在给我一些奇怪的行为。你能帮我弄清楚发生了什么吗? :)

所以,我有一系列输入,如此

$first_name = "<script>alert();</script>";
$middle_name = 'Robert';
$last_name = 'Smith';
$username = 'testusername1';
$email = "testemail@mail.com";
$password = 'banana1';

我正在测试它们的XSS,使用htmlspecialchars,就像这样。

$first_name = htmlspecialchars($first_name, ENT_QUOTES, 'UTF-8');

可以正常运行$ first_name中的脚本。

但是,将此代码粘贴到foreach循环中,并运行javascript警报。

这是我当前的foreach循环(无法正常工作)

$strings = 
array($first_name,$middle_name,$last_name,$username,$email,$password);

foreach($strings as $string) {
    $string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}

我不确定我在这里失踪了什么。我想这与将转换后的字符串分配回数组有关?但这听起来很混乱,只是感觉不是正确的答案。 IDK。

感谢您的帮助。

安德鲁

5 个答案:

答案 0 :(得分:1)

您似乎正在尝试通过引用创建foreach循环,您需要"typescript": "^2.9.1", 来使foreach数据更改在该循环之外保持...

~2.6.2

应该是:

&

正如@CBroe所指出的那样,我们必须使用foreach($strings as $string) {释放foreach循环中使用的变量...因此,您的完整解决方案将变为:

foreach($strings as &$string) {

答案 1 :(得分:0)

你无法重新分配这样的数组元素。你需要用元素的索引来做。

foreach($strings as $index=>$string) {
    $strings[$index] = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}

答案 2 :(得分:0)

您可以在不使用引用的情况下使用以下方法:

foreach($strings as $key => $string) {
    $strings[$key] = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}

答案 3 :(得分:0)

foreach中存在问题,也许htmlspecialchars函数将正确运行。 请查看以下文章。

https://stackoverflow.com/questions/10057671/how-does-php-foreach-actually-work

答案 4 :(得分:0)

foreach适用于数组的副本,不会有任何更改。

// your array
$strings = array(
    'first_name'    => $firstname,
    'middle_name'   => $middle_name,
    'last_name'     => $last_name,
    'user_name'     => $username,
    'email'         => $email,
    'password'      => $password
);

// filtered: the array which contains your escaped data.
$filtered = array_map(function($string) { 
                  return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); 
            }, $strings);

// to access your filtered data:
// $filtered['first_name'] contains the filtered first name
// $filtered['middle_name'] contains the filtered middle name
// and so on ...