Xan*_*ano 38 php login undefined-index
我正在尝试重新学习一些PHP基础知识来制作一个简单的登录脚本,但是我得到了一个我之前没有收到的错误(我在一年多前制作了相同的脚本并且从未出现过这个错误.我简化了代码我可以测试哪个区域有问题,这是问题所在:
<?php
$user = $_POST["username"];
if($user != null)
{
echo $user;
echo " is your username";
}
else
{
echo "no username supplied";
}
?>
Run Code Online (Sandbox Code Playgroud)
现在,当我将一个变量发送到脚本时,这段代码工作正常,但是当没有提供变量时,它会发出错误.理论上这很好,因为如果没有提供用户名/传递,那么预计会出错.在代码发送到脚本之前,我将检查以确保这一点,但是我担心不知何故空字符串可能泄漏并吐出一些未知错误.这是我得到的错误:
( ! ) Notice: Undefined index: username in C:\wamp\www\verify_login.php on line 2
Call Stack
Time Memory Function Location
1 0.0003 668576 {main}( ) ..\verify_login.php:0
Run Code Online (Sandbox Code Playgroud)
没有提供用户名
你可以看到代码寄存器没有提供变量,但它给出了错误,我假设意味着没有找到一个变量是预期的或类似的东西.有人可以帮我澄清一下吗?
Mar*_*eed 52
在PHP中,从未设置的变量或数组元素与值为的变量或数组元素不同null
; 尝试访问此类未设置值是运行时错误.
这就是你所遇到的:数组$_POST
中的键没有任何元素"username"
,因此解释器在进入无效测试之前就会中止你的程序.
幸运的是,您可以测试变量或数组元素的存在,而无需实际尝试访问它; 这就是特殊运营商的isset
作用:
if (isset($_POST["username"]))
{
$user = $_POST["username"];
echo $user;
echo " is your username";
}
else
{
$user = null;
echo "no username supplied";
}
Run Code Online (Sandbox Code Playgroud)
当PHP试图获取$_POST["username"]
作为参数传递给函数的值时,它看起来会以与代码完全相同的方式爆炸isset()
.但是,isset()
根本不是一个函数,而是在评估阶段之前识别的特殊语法,因此PHP解释器检查值的存在而不实际尝试检索它.
值得一提的是,随着运行时错误的发生,缺少的数组元素被认为是次要元素(分配了E_NOTICE
级别).如果更改error_reporting
级别以便忽略通知,则原始代码将实际按写入方式工作,并尝试返回数组访问权限null
.但这被认为是不好的做法,特别是对于生产代码.
旁注:PHP进行字符串插值,因此块中的echo
语句if
可以组合成一个:
echo "$user is your username";
Run Code Online (Sandbox Code Playgroud)
使用:
if (isset($_POST['user'])) {
//do something
}
Run Code Online (Sandbox Code Playgroud)
但是你可能应该使用一些更合适的验证.尝试使用Zend Framework或Symfony中的简单正则表达式或坚如磐石的实现.
http://framework.zend.com/manual/en/zend.validate.introduction.html
http://symfony.com/doc/current/book/validation.html
甚至是内置的过滤器扩展:
http://php.net/manual/en/function.filter-var.php
永远不要相信用户输入,要聪明.不要相信任何事情.始终确保您收到的是您所期望的.如果它应该是一个数字,请确保它是一个数字.
很多改进的代码:
$user = filter_var($_POST['user'], FILTER_SANITIZE_STRING);
$isValid = filter_var($user, FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => "/^[a-zA-Z0-9]+$/")));
if ($isValid) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
消毒和验证.
在 PHP 5.2.0 及更高版本之前,您应该使用filter_input()
专门为此创建的它来获取特定的外部用户输入,例如按名称获取、发布或 cookie 变量,并可选择对其进行过滤以避免对您的站点进行任何 XSS/注入攻击。例如:
$user = filter_input(INPUT_POST, 'username');
Run Code Online (Sandbox Code Playgroud)
您可以使用 INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER 或 INPUT_ENV 之一。
通过使用可选的第三个参数,则可以通过各种扩展它的过滤器(用于验证,消毒,过滤或其他),例如FILTER_SANITIZE_SPECIAL_CHARS
,FILTER_SANITIZE_ENCODED
等
例如:
<?php
$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo "You have searched for $search_html.\n";
echo "<a href='?search=$search_url'>Search again.</a>";
?>
Run Code Online (Sandbox Code Playgroud)
语法是:
混合
filter_input
( int $type , string $variable_name [, int $filter = FILTER_DEFAULT [, mixed $options ]] )(PHP 5 >= 5.2.0,PHP 7)
归档时间: |
|
查看次数: |
172575 次 |
最近记录: |