这些天把一网站要移植到一个新的环境,什么都架设好,上传了数据。首页可以很正常的打开,新闻页却打不开新闻内容。
这是一个很老的php网站,mysql的数据库。暂且不谈它的设计模式、安全性。仔细查看代码觉得异样
<? include("config.php"); $result=mysql_query("select news.title,nusers.bm,news.refertime,news.content,news.brownum from news,nusers where news.userid=nusers.userid and news.newid=’$id’",$db); $row=mysql_fetch_array($result); ?>
config.php是数据库连接
这sql语句里有一变量:$id。
这正是用get方法传过来的值。并没有用get方法获取,所以修改之
<?php include("config.php"); $id= $_GET[’id’]; $result=mysql_query("select news1.title,nusers.bm,news1.refertime,news1.content,news1.brownum from news1,nusers where news1.userid=nusers.userid and news1.newid=’$id’",$db); $row=mysql_fetch_array($result); mysql_close($db); ?>
这样便读取正常了。但为什么以前的环境可以正常读取呢?查找了一些资料发现,在php.ini的配置里面有一个register_globals。register_globals变量设置为On的时候,各种类型的变量都被注入代码中,就像现在这里的表单请求变量。再由于php使用变量并不需要初始化,所以很容易写出不安全的代码。就像现在这里直接通过表单传递变量$id的值到sql查询,是十分不安全的。
所以现在普遍建议的设置register_globals=Off。而被请求的页面使用get方法获取值,并对获取的值进行转义,对sql语句进行mysql_real_escape_string()深度转义,防止sql注入。
更多关于register_globals可以查看http://cn.php.net/manual/zh/security.globals.php
发表回复