随笔 · 2012/01/03 0

Get请求无反应,关于registe_globals

这些天把一网站要移植到一个新的环境,什么都架设好,上传了数据。首页可以很正常的打开,新闻页却打不开新闻内容。

这是一个很老的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。

2024e9d4e75e92a551bf8f56d475c0eb20120103013051439211656 第1张

这正是用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

0
希望看到您的想法,请您发表评论x