gpt4 book ai didi

php - 防止数据库类中的 SQL 注入(inject)

转载 作者:可可西里 更新时间:2023-11-01 07:06:44 25 4
gpt4 key购买 nike

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

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 查询时,要想通过查找变量来防止注入(inject)已经太晚了——否则它已经内置到 PHP 中了。

转义需要在您构建查询时更早地完成。您可以使用查询构建类。

不过,我会推荐一种不同的方法 - 即拥有一个提供数据库表作为对象的层,这里是一个示例 user object这是从 base db entity class 派生的它使用 active record pattern 提供了一个完整的数据库接口(interface), 和 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());
}

关于php - 防止数据库类中的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2540611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com