if ( ! defined(‘BASEPATH’)) exit(‘No direct script access allowed’)的作用

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 常量

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112174.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • RSA加密算法的java实现

    RSA加密算法的java实现最近有一个外部合作项目要求在数据传输过程中使用RSA加密算法对数据进行加密,所以需要编写一个加解密的工具类,因为对方不是java语言,所以是各自实现的这个工具,本文主要讨论实现以及双方调试过程中的一些插曲,希望给大家不要再次踩坑。关于加解密的核心部分,网上有很多博主都有实现过,我也是参考了一些博主的方法自己实现了一个加解密的工具。packagecom.chen.test;importorg.

    2022年5月1日
    40
  • Java设计模式菜鸟系列(两)建模与观察者模式的实现

    Java设计模式菜鸟系列(两)建模与观察者模式的实现

    2022年1月12日
    53
  • js 删除数组指定元素的方法

    js 删除数组指定元素的方法首先需要找到元素的下标 vararr 2 5 9 varindex arr indexOf 5 使用 splice 函数进行移除 if index gt 1 arr splice index 1 splice 函数的第二个参数指删除的数目 splice 直接修改原数组 并把删除的所有元素以另一个新数组的方式返回 nbsp

    2025年10月16日
    1
  • struts拦截器如何使用_信号拦截器

    struts拦截器如何使用_信号拦截器拦截器概述Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP(AspectOrientedProgramming,面向切面编程)的一种实现拦截器栈(InterceptorStack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链

    2022年10月6日
    2
  • 奶妈教程之基于ADS的带通滤波器仿真「建议收藏」

    奶妈教程之基于ADS的带通滤波器仿真「建议收藏」基于ADS的带通滤波器教学1.试验参数 版本:ADS2021 带通频率范围:3.3GHz~3.8GHz 带阻频率范围:3.1GHz~4.0GHz 特征阻抗:Z=50Ohm2.试验步骤(1)打开ADS软件并新建工程,如图所示(2)建立原理图工程点击图中红圈所示的图标,建立原理图建立带通滤波器工程然后会进入这样一个界面点击DesignGuide下的Filter点击弹出界面下红圈所示的指令此时整个程序界面如图所示,继续点击红圈所示的符号放入设计界面中然后选择图中红圈窗

    2022年5月22日
    47
  • 关联关系和依赖关系的区别[建议收藏]

    关联关系:A类实例化的时候需要B类的对象引用或指针作为参数依赖关系:A类的某个方法使用B类,可能是方法的参数是B类或在方法中获得了一个B类的实例某个类以成员变量的形式出现在另一个类中,二者是关联关

    2021年12月18日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号