zoukankan      html  css  js  c++  java
  • if ( ! defined('BASEPATH')) exit('No direct script access allowed')的作用

    在看源代码时,发现codeigniter框架的控制器中,总是加上这样一段话;

    if(!defined('BASEPATH'))exit('No direct script access allowed');
    1
    刚接触codeigniter,一直没有领会它的作用,后来通过查资料发现其作用是:

    为了防止跨站攻击,直接通过访问文件路径用的

    另外要注意,这里定义的是:defined()而不是define(),如果你误将defined写成define,将会报一下错误:

    A PHP Error was encountered
    Severity: Warning
    Message: define() expects at least 2 parameters, 1 given

    <?php
     2 //放止用户直接通过路径来访问控制器,如果这样的话会显示找不到
     3 if ( ! defined('BASEPATH')) exit('No direct script access allowed');
     4 
     5 class Hello extends CI_Controller {
     6 
     7     public function sayhello($name,$name2){
     8         echo $name,",Hello CI to ",$name2;
     9     }
    10 }
    

      


    注意
    1、defined() 函数仅对 constants 有效(上面的例子不是define(),写成define()的话会报错的)

    经常看到这样的语句: 

    $file = fopen($filename, r) or die("抱歉,无法打开: $filename"); 

    or 在这里是这样理解的,因为在PHP中并不区分数据类型,所以$file既可以是int也可以bool,所以这样的语句不会报错。

    其实在大多数的语言中, bool or bool这样的语句中,如果前一个值为真后一个值就不会再判断了。这里也是的,所以如果fopen函数执行正确的话,会返回一个大于0的int值(这其实就

    是“真”),后面的语句就不会执行了。如果fopen函数执行失败,就会返回false,那么就会判断后面的表达式是否为真了。 

    结果执行了die()之后,不管返回什么,程序都已经停止执行了,并且显示指定的出错信息,也就达到了调试的目的。 

    同理:

    defined('THINK_PATH')   or define('THINK_PATH',     __DIR__.'/');

    如果 THINK_PATH 这个常量已经被定义了,那么就不执行 or 后面的 define('THINK_PATH',     __DIR__.'/'); 

    相反,如果没有定义 THINK_PATH  这个常量,那么就会执行后面的 define('THINK_PATH',     __DIR__.'/');  定义 THINK_PATH 常量

  • 相关阅读:
    字符串加密和解密的常类
    vs2013中使用nuget下载cefsharp winform包
    序列积第m小元素 二分答案优化
    贪心 park
    struct结构体 重载运算符
    最小生成树kruskal 知识点讲解+模板
    c++快读与快输模板
    MZOJ #82 总统竞选
    MZOJ #83 位运算
    MZOJ #81 最小得分和
  • 原文地址:https://www.cnblogs.com/lxwphp/p/11245822.html
Copyright © 2011-2022 走看看