文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>五个常见 PHP 数据库问题(读感)

五个常见 PHP 数据库问题(读感)

时间:2007-05-08  来源:liuxingyuyuni


http://www.phpchina.com/bbs/viewthread.php?tid=24563

问题 1:直接使用 MySQL
    我以前就是直接使用mysql的函数, 在考虑到防注入方面还是要使用数据库的操作类:ADODB,mysqli(这个也是PHP自带的函数也不可以使用么?)PEAR DB,ADODB等
    我也写过关于MYSQL的类,但是没有实现在SQL中使用"?"这个东东,那是不是意味着这个类有安全问题呢?

顺手整理了一下SQL注入攻击的一些资料:

1. sql注入为何产生?

没有对用户输入数据的合法性进行判断(例如过滤特殊字符JS代码HTML代码等等),使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。给大家一个小例子呵呵:

最简单的例子:
http://localhost/index.php?action=view&page=1
            这里边action page 你可以直接在网页上修改,这和程序修改完全是两码事,用户在SQL上修改以获得他想要的{任何}数据,简单的说这就是SQL注入攻击,下边是程序要做的
index.php =>code
                           switch($action)
                           {
                                  case 'view'
                                      .......
                                      break
                                   .....等等 这是程序做的
                           }
而这个是用户自己乱改的(当然是恶意的)
            
http://localhost/index.php?action=del&page=9999999999999

这里边关系到一些基本的东西,页码page真的有这么多分页么?你的分页类是否考虑到这种情况?
你的这个页面是否对del页面加入了权限判断(当然会加我想这个基本的应该会做到吧,但是考虑一下没有加的情况会是怎么样......)

所以应该对URL进行合理的判断,专门封装一个URL较验类不错.
---------------------------------------------------------
http://blog.chinaunix.net/u/10599/?admin=true
这是我在我博客上加的一个东西,很显然没有对$_GET这个数据进行很好的判断,也许构不成任何危协吧?但是安全性极高的网站必须对所有的东西进行检查,如果出现了不应该出现的东西应该警报,至少记入日志当中,我想以前大家经常看到这样的页面
http://localhost/index.php?str="你好"
在页面中就会出现"你好" 将str 改成FUCK他就是FUCK,咱们假如说CU上有这样的一个应用
http://blog.chinaunix.net/u/10599/str="你是大好人!" 而且这个网站是一个非常著名的网站
我可不希望你将这个页面改成
http://blog.chinaunix.net/u/10599/str
="你是大坏人!"然后给我满世界的发.............以前很多朋友开过这样的玩笑吧?呵呵..所以判断URL很重要,如果这样的应用出现在政府网站中可不得了!


以下是在网上看到的一句话:
{SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。}
因为SQL是通过正常修改URL实现的..所以这个只能靠对URL判断来防止,$_GET真的应该少用.总之一句话严格控制你的URL里边应该有哪些东西不应该有哪些东西,如果有的话应该怎么样进行处理
在你的应用当中的每一个页面加上include_once('preSqlAtt.php')是必要的
因为对网站攻击挺感兴趣所以我以前的时候也玩过一些SQL注入工具,类似阿D之类的,呵呵...
有一个地方不明白SQL中加"?"他到底做了哪些事情....待严究.有知道的朋友贴上来代码也行


-----------------------------------------------------
问题 2:不使用自动增量功能

?php
require_once("DB.php");
function add_user( $name, $pass )
{
  $dsn = 'mysql://root:password@localhost/good_genid';
  $db =& DB::Connect( $dsn, array() );
  if (PEAR::isError($db)) { die($db->getMessage()); }
  $sth = $db->prepare( "INSERT INTO users VALUES(null,?,?)" );
  $db->execute( $sth, array( $name, $pass ) );
  $res = $db->query( "SELECT last_insert_id()" );
  $id = null;
  while( $res->fetchInto( $row ) ) { $id = $row[0]; }
  return $id;
}
$id = add_user( 'jerry', 'pass' );
var_dump( $id );
?>
没啥可说的,一直这么干

3.使用多个数据库
他这里说的其实就是优化你的SQL
使用多数据库时也曾犯过这样的问题:连接DB,选择DB(这个其实通过SQL也可以省掉:select 库.表.字段 from 库.表)
例:select xfcz.xf_users.* from xfcz.xf_users;
重要:减少数据库查询,构建良好SQL.
4. 不使用关系
这个东东说了数据库表设计,汗!
其实数据库设计真的是很难......但是确非常的重要,一个成功的网站必定有一个成功的数据库模式设计(努力中)虽然咱们都不是做专业数据库模式设计的,但是也要懂一些基本的数据库设计技巧,对付一般应用足够了....高级的就有高级的家伙去搞定了,还是乖乖写你的CODE吧,呵呵.
问题 5:n+1 模式
说的还是减少数据库查询,构建良好SQL(表设计得牛XXX一些.要不然多出那么多查询也是无耐至少我现在经常为这个表的设计而头疼,唯一的办法是多看一下别人的表设计是怎样的.总结总结再总结)
结束


相关阅读 更多 +
排行榜 更多 +
jojo的奇妙冒险手机版下载

jojo的奇妙冒险手机版下载

飞行射击 下载
雪糕工厂 v9.87.13.02 安卓版

雪糕工厂 v9.87.13.02 安卓版

休闲益智 下载
雪糕工厂 v9.87.13.02 安卓版

雪糕工厂 v9.87.13.02 安卓版

休闲益智 下载