加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

php – 防止SQL注入数据库类

发布时间:2020-12-11 23:51:02 所属栏目:MySql教程 来源:网络整理
导读:我正在构建一个数据库类,并认为合并某种形式的SQL注入预防是个好主意(呃!).这是运行数据库查询的方法: class DB{ var $db_host = 'localhost'; var $db_user = 'root'; var $db_passwd = ''; var $db_name = 'whatever'; function query($sql) { $this-res

我正在构建一个数据库类,并认为合并某种形式的SQL注入预防是个好主意(呃!).这是运行数据库查询的方法:

class DB
{
    var $db_host    = 'localhost';
    var $db_user    = 'root';
    var $db_passwd  = '';
    var $db_name    = 'whatever';

    function query($sql)
    {
        $this->result = mysql_query($sql,$this->link);
        if(!$this->result)
        {
           $this->error(mysql_error());
        } else {
            return $this->result;
        }
    }
}

课堂上还有更多,但我只是因为这个而削减它.我面临的问题是如果我只使用mysql_real_escape_string($sql,$this-> link);然后它会转义整个查询并导致SQL语法错误.如何动态查找需要转义的变量?我想避免在我的主代码块中使用mysql_real_escape_string(),我宁愿在函数中使用它.

谢谢.

最佳答案 问题是,当你构建一个SQL查询时,通过查找变量来防止注入为时已晚 – 否则它已经内置到PHP中.

在构建查询时,需要更早地进行转义.您可以使用查询构建类.

但是,我建议采用不同的方法 – 这是一个提供数据库表作为对象的层,这里是一个示例user object,它是从base db entity class派生的,它提供了使用active record pattern和iterator pattern的数据库的完整接口.

我将通过一些例子说明这一点;这里整洁的东西是迭代器,因为你可以抽象出更多,并在线上提供一些非常通用的类来提取数据.

使用上述方法创建用户记录:

$user = new DbUser();
$user->create();
$user->set_email('test@example.com');
$user->write();

要读取用户记录:

$user = new DbUser();
$user->set_email('text@example.com');
if ($user->load_from_fields())
{
}

迭代记录:

$user_iterator = DbUser::begin();
if ($user_iterator->begin())
{
    do
    {
         $user = $user_iterator->current();
         echo $user->get_email();
    } while ($user_iterator->next());
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读