为什么在不声明全局全局变量的情况下运行此php代码?

时间:2020-01-11 15:09:38

标签: php forms function scope

这段代码正在运行并提供输出,但是我的问题是为什么当我不使用全局关键字时为什么能从函数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();
 ?>            

1 个答案:

答案 0 :(得分:0)

从顶部开始。 您的包含字符串的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的内容,该内容等于用户使用字段名称为"number"的HTTP Post Request发送的内容。用户可以向您发送任何内容,您将回显它。含义:我可以向您发送有效的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)的攻击。<​​/ p>

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

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