首页 > 解决方案 > 为什么这个 php 代码在没有在函数内部声明变量全局的情况下运行?

问题描述

这段代码正在运行并提供输出,但我的问题是为什么我没有使用 global 关键字时能够从函数 pali 中访问变量 abc 和 def?

<form action=palindrome.php method=post>
<input type="text"  name="number" type=submit> 
</form>
<?php
 $a=$b=0;
 $abc= $def = $_POST["number"];
 echo "$def</br>";
 function pali()
 { while($abc>=1)
   { $a=$abc%10  ;
     $b=$b*10+ $a ;
     $abc= $abc/10;
   }
   if($def==$b)
   echo '$def is palindrome '.$def ;
   else 
   echo '$def is not a palindrome '.$def;
   echo "<br>$b";
}
 pali();
 ?>            

标签: phpformsfunctionscope

解决方案


从顶部开始。包含字符串的 HTML 属性应包含在字符串中,如下所示:

<form action="palindrome.php" method="POST">

您不能在 -Tag 上定义多个类型属性:https ://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input 您必须创建多个元素:

<input type="text" name="number"> 
<input type="submit" name="submit"> 

以下行易受跨站点脚本 (XSS) 攻击。在发布实际的 Web 应用程序之前,您必须了解并防止 XSS(和其他)。

$abc= $def = $_POST["number"];
echo "$def</br>";

快速说明:您正在输出变量 的内容$def,这等于用户使用带有字段名称的 HTTP Post 请求发送的内容"number"。用户可以发送任何东西给你,你会回应它。含义:我可以向您发送有效的 HTML,您会回显出来,我的浏览器会将其评估为 HTML,因为他没有理由相信这不是您想做的事情。

解决您的函数和变量范围。如果您想在函数中使用其他代码中的变量(在面向对象编程 [OOP] 等中有例外),您需要在函数内部将它们作为参数传递:https ://www.php.net/manual/ en/functions.arguments.php 你可以像这样定义你的函数:

function pali($a, $b, $abc, $def) { /* (Your logic goes here) */ }

你会这样调用你的函数:

pali($a, $b, $abc, $def);

我必须指出,您的函数再次容易受到跨站点脚本 (XSS) 的攻击。

echo '$def is palindrome '.$def ;
else 
echo '$def is not a palindrome '.$def;
echo "<br>$b";

您再次回显变量中的任何内容。但是,$def前 2 个回显中的第一个不会回显内容,而是回显文本 $def,因为您确实使用了单引号。如果您尝试在单引号内回显变量的内容,它将不起作用,只能使用双引号。如果您正在学习,编写不安全的应用程序是可以的,但是稍后,在发布应用程序之前,您需要了解 Web 应用程序安全基础知识(SQLi、XSS 等)。


推荐阅读