isset()用于检验变量是否设置。我有个疑问,首先表单里,如<input type=“text” name="age">这个表单,我就算不填任何东西,提交到后台,isset($_REQUEST["age"])也是true呀。。那你到底检测什么?用户自己造参数访问?减少不必要假请求?还有就是设置个隐藏域,来检测表单是否提交,那用户检查元素,查到了<input type="hidden" name="sub">这里的name,也是可以伪造一个提交的过程呀?isset()的意义到底在哪?

解决方案 »

  1.   

    是否设置 不是检测 是否填写了任何东西如果要判断是否有内容 应该使用empty()函数还有就是设置个隐藏域,来检测表单是否提交,那用户检查元素,查到了<input type="hidden" name="sub">这里的name,也是可以伪造一个提交的过程呀?
    这个时候就需要你对提交的 name数据做一个校验了
    最简单的 验证码 /token/加密 不都可以吗?
      

  2.   

    如果是提交到表单处理页,那么 isset 表单变量似乎的多余的
    但如果是直接 url 进入表单处理页,那你还觉得 isset 多余吗?
      

  3.   

    isset 只检测变量是否定义。而不管他的值是否为空。比较isset与!empty()
    $a=''; 
    var_dump(isset($a));  //true
    var_dump(!empty($a));  //false
      

  4.   

    对比一下几种情况$a=array(); 
    var_dump(isset($a['test']));
    var_dump(empty($a['test']));
    var_dump(array_key_exists('test',$a));$a['test']=NULL; 
    var_dump(isset($a['test']));
    var_dump(empty($a['test']));
    var_dump(array_key_exists('test',$a));$a['test']=''; 
    var_dump(isset($a['test']));
    var_dump(empty($a['test']));
    var_dump(array_key_exists('test',$a));$a['test']='text'; 
    var_dump(isset($a['test']));
    var_dump(empty($a['test']));
    var_dump(array_key_exists('test',$a));
      

  5.   

    建议你看看isset和empty的区别吧
      

  6.   

    回1楼:
    我知道是在检测”是否设置“,但为什么要检测呢,如果没设置,我去判断它干什么,何况后台也没提供专门的函数来处理呀,所以检测的意义在什么地方?
    name的数据,打开firebug工具,不都能看到吗,直接粘在url后头,不能模拟一个get访问吗?那既然我都可以直接url模拟,那我咋知道到底是url过来的,还是表单提交的。回2楼:
    但如果是直接 url 进入表单处理页,那你还觉得 isset 多余吗?
    比如有两个页面
    1.php里有:
    <a href="2.php?name=xx">我们</a>
    2.php里有:
    if(isset($_REQUEST["name"])){
        echo 1;
    };
    做了测试,无论是链接过来的,还是表单过来的,isset($_REQUEST["name"]的结果都是true呀,所以意义在哪?
      

  7.   

    回8楼,举个实际例子呀。
    对呀,你都已经提到,而且异常捕捉来处理,那跟isset有什么关系?
      

  8.   

    你要是在url直接打开2.php,还能进入if分支吗?
      

  9.   

    用isset判断都是为了做不同的处理,有数据跟无数据做不同的处理。
      

  10.   

    这样呢
    <a href="2.php">我们</a>
    <a href="2.php?names=xx">我们</a>
      

  11.   

    你认为一个网站直接输入url就能出现页面好不好?有些页面无关紧要但是有些页面是不可以的,他需要用户的一些必须信息。那么在进入这些页面之前你就要做判断(方法很多,isset()只是一种)一些必须的信息,判断用户登陆的session 。
    还有你说的表单,一般都会有一些隐藏域数据。比如数据库表里的id=10.当你提交表单去更新数据的时候你必须要判断一下isset($_POST['id']) && $_POST['id'] != '' 只有存在的时候采取更新,不存在直接404.
    我说的只是简单的一种可能还有很多的,判断也不仅限于isset。判断的意义就是防止出错。
      

  12.   

    回1楼:
    我知道是在检测”是否设置“,但为什么要检测呢,如果没设置,我去判断它干什么,何况后台也没提供专门的函数来处理呀,所以检测的意义在什么地方?
    name的数据,打开firebug工具,不都能看到吗,直接粘在url后头,不能模拟一个get访问吗?那既然我都可以直接url模拟,那我咋知道到底是url过来的,还是表单提交的。
    //===
    上面有人跟你说了 如果别人给你瞎提交数据的话你的程序就会不停的出错。另外判断是否设置是为了下一步继续操作的条件.一般直接判断是否为空即可.name打开firebug能看到 所以我跟你说了 token 加密 验证码 的解决方法就能基本上杜绝这种人肉模拟get.
    如果他要去读取你的参数例如验证码,然后再拼装起来发送给你那已经属于可以接受的范围了.一个简单的加密方法用户访问你的表单页面 session 产生一个加密串。提交的时候判断加密串是否存在,不存在或者解密后与加密内容不符那么就可以判断为非法提交内容.最后如果你还不放心 使用ssl吧.使用证书来管理你的访问
      

  13.   

    isset只是说定没定义,有没有,而不是是否为空。
      

  14.   

    任何人想要在一个网站玩下去起码要登陆吧,登陆状态在SESSION里就可以了,讨论毛。
      

  15.   

    还是检测一下好。不然弄出个warning来,不好看。虽然warning可以关闭。
      

  16.   

    接收表单数据要么GET要么POST,REQUEST不常用。判断就更简单:if(isset($_POST["age"])){
      echo "true";
    }else{
      echo "false";
    }Request 变量:$_REQUEST
    注意: 在 PHP 4.1.0 及以后版本使用。之前的版本,没有等价的数组。注意: 在 PHP 4.3.0 之前,$_FILES 也被包括在 $_REQUEST 数组中。此关联数组包含 $_GET,$_POST 和 $_COOKIE 中的全部内容。经由 GET,POST 和 COOKIE 机制提交至脚本的变量,因此该数组并不值得信任。所有包含在该数组中的变量的存在与否以及变量的顺序均按照 php.ini 中的 variables_order 配置指示来定义。