我正在处理一些安全问题,而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。
感谢您的帮助。
安德鲁
答案 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 ...