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