php – 防止SQL注入数据库类

前端之家收集整理的这篇文章主要介绍了php – 防止SQL注入数据库类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

  1. class DB
  2. {
  3. var $db_host = 'localhost';
  4. var $db_user = 'root';
  5. var $db_passwd = '';
  6. var $db_name = 'whatever';
  7. function query($sql)
  8. {
  9. $this->result = MysqL_query($sql,$this->link);
  10. if(!$this->result)
  11. {
  12. $this->error(MysqL_error());
  13. } else {
  14. return $this->result;
  15. }
  16. }
  17. }

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

谢谢.

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

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

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

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

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

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

要读取用户记录:

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

迭代记录:

  1. $user_iterator = DbUser::begin();
  2. if ($user_iterator->begin())
  3. {
  4. do
  5. {
  6. $user = $user_iterator->current();
  7. echo $user->get_email();
  8. } while ($user_iterator->next());
  9. }

猜你在找的MySQL相关文章