php 无法在foreach循环中使用htmlspecialchars和数组,为什么?[副本]

gtlvzcf8  于 2023-06-04  发布在  PHP
关注(0)|答案(6)|浏览(426)

此问题已在此处有答案

How to modify an array's values by a foreach loop? [duplicate](2个答案)
Why can't I update data in an array with foreach loop? [duplicate](3个答案)
PHP foreach change array value [duplicate](2个答案)
Modify array values in foreach loop [duplicate](2个答案)
Array of associative arrays, add new elements to the associative arrays [duplicate](8个回答)
2天前关闭。
我正在做一些安全方面的工作,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
谢谢你的帮助。
安德鲁

jjhzyzn0

jjhzyzn01#

看起来你正在尝试通过引用创建一个foreach循环,你需要一个&来使你的foreach数据更改在该循环之外持久化...
foreach($strings as $string) {
应为:
foreach($strings as &$string) {
正如@CBroe所指出的,我们必须使用unset来释放foreach循环中使用的变量...因此,您的完整解决方案将成为:

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

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

unset($string);
qcbq4gxm

qcbq4gxm2#

不能像这样重新分配数组元素。您需要使用元素的索引来执行此操作。

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

oyt4ldly3#

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

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

goucqfw64#

foreach中有一个问题,可能htmlspecialchars函数将正确运行。请查看以下文章。

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

5vf7fwbs5#

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 ...
4sup72z8

4sup72z86#

参加聚会有点晚了;但是,我想最简单的方法是使用array_map,这样就不需要执行foreach循环了。

array_map('htmlspecialchars', $strings);

因此,整个代码看起来如下所示:

$first_name = "<script>alert();</script>";
        $middle_name = 'Robert';
        $last_name = 'Smith';
        $username = 'testusername1';
        $email = "testemail@mail.com";
        $password = 'banana1';
         // Here goes your string which is an array of the above variables...
        $strings = array ($first_name, $middle_name, $last_name, $username, $email, $password);
         // Here goes the trick :) 
        $strings = array_map('htmlspecialchars', $strings);

相关问题