解决方案 »

  1.   

    1.SESSION['db'] 是$_SESSION['db']吗?
    2.为什么要把dbname写在session?
    为什么不没个site用一个config文件记录不同的信息,例如 每个site都有一个config.php,
    define('DBNAME', 'db1');
    3.你的session是保存在db吗?
      

  2.   

    50个企业共用一套PHP脚本,意味着 config.php只有一个, 50个企业一起用。 所以无法单独设置。 不过你到是给我一个灵感,我可以弄config1.php  config2.php config3 ...... 这样, 搞50个也未尝不可呢?也是一个蛮好的解决方案,虽然有点傻。呵呵
      

  3.   

    如果这样,那么50个virtual host应该是不同了吧。
    使用apache 的 Env module,使用方法见我之前写的文章:http://blog.csdn.net/fdipzone/article/details/9388959在virtual host中,加入<IfModule mod_env.c>  
    SetEnv DBNAME DB1
    </IfModule> 不同的virtual host 的值设置不同。然后在config 原来设置dbname的地方。
    例如:$dbname = 'DB1'; 改为 $dbname = $_SERVER['DBNAME'];
      

  4.   

    tips:使用Env保存的数据只能在web读取,在php cli模式下是不能读取的,请根据具体需求使用。
      

  5.   

    数据库长连接是会复用到数据库服务器的连接,但不会复用到数据库的连接从说怎么在他的系统里看到别的公司的数据入手:
    从“第一次应对措施, 我利用域名泛解析”可知,你的用户身份验证是独立的。目前SSO很流行,不排除你也在使用
    既然若干个公司可以使用同一套软件而无需修改(包括界面),可见这些公司从事的是同一行业。因此不能排除A公司的人知道B公司人的登录口令
    用多选项卡的浏览器,在A选项卡上登录A公司后,在B选项卡上登录B公司。回到A选项卡中就可看到B公司的数据了
    因为多选项卡共享一个cookie,而A设置的 sessionid 被B修改了
    其实无条件信任传入的数据,这就是CSRF攻击得以实现的基础当采用二级域名方式时,因为域名不同所以cookie也不会共用。但是如果依然是单点登录的话,由于信任域的关系,情况不会有任何改变目前太多的人不相信数据库的能力,喜欢弄个数据缓存之类的东西(怕数据库累死了,怜悯精神可嘉)
    数据缓存多以查询名区分,而在你的系统中区分数据隶属关系的是库名,弄混淆了也是很正常的
      

  6.   

    如果没有使用缓存,则去掉了问题可能存在的一个方面
    如果不仅仅信任 $_SESSION['db'],而是再有至少一种 判定用户来源的手段的话,则又可以去掉问题可能存在的一个方面
    当你把已知的可能出问题的方面都排除了,问题还没解决
    那就是还有未知的潜在问题存在,这才是需要讨论的问题楼主也是这个意思,他希望你把你知道的可能出现问题的方面罗列出来,以便于他排查
    至于如何解决,那是后话了。问题没有找到,任何解决方案都是徒劳的
      

  7.   


    我还是比较怀疑是长连接的问题。 您说的没错, “长连接是会复用到数据库服务器的连接”, 前提是此连接的用户名和密码一样,而我恰恰是所有企业连接到服务器的用户名都是一样的,只是在到数据库的链接的时候,用SESSION[''DB']去区分。  所以请教下这种情况,有没有存在一定的概率,把数据库的链接也给复用了?尤其是SESSION['DB']因为某种不确定原因被清空了的时候?
      

  8.   


    这个100%可以排除。 如果是数据库缓存导致的,就和我第一帖分析的一样,不应该连其他企业的数据也可以修改。 因为缓存仅仅是读取,针对SELECT, 不可能连UPDATE DELETE都能生效的。 对吧?感谢各位的热心帮助。 我再努力排查排查。 感觉学到不少
      

  9.   

    我没有用50个 VIRTUAL HOST, 就一个, 只是利用域名的泛解析。 把所有二级域名都指向一个virtual host。 
      

  10.   

    有没有存在一定的概率,把数据库的链接也给复用了?
    绝无存在的可能尤其是SESSION['DB']因为某种不确定原因被清空了的时候?
    如果 SESSION['DB'] 被清空,那么就相当于执行 mysql_select_db('') 这是要出错的 (No database selected)我说的缓存是指项目的 cache 功能
    一般用于缓存查询结果,频繁访问时不去读数据库如果用二级域名,则应将二级域名与数据库名绑定
      

  11.   

    ,新人路过学习一下
    如果是我做这个东西,会把客户单独建表,然后每个数据表和索引都加上一个客户ID字段,弄一个简易的总后台添加客户,这样方便管理~
    前台的Model层传入where xxx 筛选变量时,统一添加上客户ID=xxx~不过不确定这样做法的弊端
      

  12.   

    我没有用50个 VIRTUAL HOST, 就一个, 只是利用域名的泛解析。 把所有二级域名都指向一个virtual host。 難怪,不過提供的信息不算太多。比較難分析,老大已經分析得比較全面了。
      

  13.   

    你是根據域名,即$_SERVER['HOST'] 判斷使用什麼數據庫連接嗎?能否提供那部分的代碼參考呢?
      

  14.   

    目前我的做法是每一家公司使用一個獨立的域名,程式根據不同的域名來讀取各自不同的配置檔.
    a公司用http://a.xx.com
    b公司用http://b.xx.com會話不跨域,目前多個企業之間沒有出現串數據的問題,一直表現的比較穩定,你可以借鑒看看.
      

  15.   

    xuzuning版主很强大。 
    我先结贴了。 目前做法就是在几个地方设置了异常的判断,如果再次出现再来请教!