php - 为什么这个 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();
?>
解决方案
从顶部开始。包含字符串的 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 等)。
推荐阅读
- java - Spring TestCode 错误:无法加载 ApplicationContext
- unity3d - UNITY 3D - 下沉物体问题
- r - 稀疏矩阵的 R 内存高效平方
- c# - 我想以 Crystal 视图 C# 窗口形式显示数据库中的行
- google-chrome - 如何将不属于tomcat会话一部分的cookie标记为安全
- oracle - 表更改后 Oracle SQL 过程变得无效
- image - 在颤动中为堆栈创建小部件类
- kong - 如何在 Kong 中禁用 /gateway 路径
- .net - 如何从 .NET 核心中的 Kafka 消费者发送 json 对象并使用 Web 套接字将其实时发送到 Angular
- react-native - 使用 Jest 进行测试时出现“TypeError: Cannot read property 'add' of undefined”错误