当前位置: 首页 > 面试题库 >

我们应该始终绑定我们的SQL语句吗?

东门胤
2023-03-14
问题内容

我一直在研究PDO bindValue()。我知道用PDO准备我的SQL语句可以防止发生SQL注入。

代码示例:

$stmt = $dbh->prepare('SELECT * FROM articles WHERE id = :id AND title = :title');
$stmt->bindValue(':id', PDO::PARAM_INT);
$stmt->bindValue(':title', PDO::PARAM_STR);
$stmt->execute();

通过将ID绑定为数字,并且Title是字符串,我们可以限制当有人尝试在代码中进行SQL注入时所造成的损害。

我们是否应该始终将值与a绑定,PDO::PARAM_以便可以限制在SQL注入中可以从数据库中提取的内容?这样在执行PDO时会增加PDO的安全性bindValue()吗?


问题答案:

一个有两个问题。重要的是不要混淆它们

  1. 我们是否应该始终使用 占位符 来表示查询中的变量数据?
  2. 我们是否应该始终在 应用程序代码中 使用某些功能来遵循上述规则?
    另外,从对职位开头的评论中的澄清,可以看到第三个问题:

  3. 我们是否应该始终使用第三个参数,还是默认情况下让PDO将所有参数绑定为字符串是可以的?

1.对于第一个问题,答案是绝对肯定的- 是。

在第二篇文章中,出于代码的合理性和DRYness的考虑,

2.尽可能避免手动装订。

有许多避免手动绑定的方法。他们之中有一些是:

  • ORM是简单CRUD操作的出色解决方案,并且必须在现代应用程序中具有。它将完全向您隐藏SQL,在幕后进行绑定:

    $user = User::model()->findByPk($id);
    
  • Query Builder也是可行的方法,在一些PHP运算符中伪装了SQL,但又将绑定隐藏在幕后:

    $user = $db->select('*')->from('users')->where('id = ?', $id)->fetch();
    
  • 一些抽象库可能会通过 类型提示占位符 来处理传递的数据,从而再次隐藏实际的绑定:

    $user = $db->getRow("SELECT * FROM users WHERE id =?i", $id);
    
  • 如果您在上个世纪仍在使用PHP,并且在整个代码中都使用了原始PDO-那么您可以在execute()中传递变量,仍然可以节省很多输入:

    $stmt = $dbh->prepare('SELECT * FROM users WHERE id = ?');
    

    $stmt->execute([$id]);
    $user = $stmt->fetch();

关于第三个问题-只要您将数字绑定为字符串(但不是相反!)-

3. mysql没关系,几乎每个参数都以字符串形式发送

因为mysql总是会将您的数据转换为正确的类型。我所知道的唯一一种情况是LIMIT子句,在该子句中无法将数字格式化为字符串-
因此,当在仿真模式下设置PDO且必须在LIMIT子句中传递参数时,唯一相关的情况是。在所有其他情况下,您可以省略第三个参数,也可以显式调用to,bindValue()而不会出现任何问题。



 类似资料:
  • 问题内容: 在编写自己的类时,是否总是有必要重写? 如果我不这样做,它将自动检查所有字段是否相同?还是只是检查两个变量是否指向同一个对象? 问题答案: 如果正在编写将要以某种方式比较其对象的类,则应重写和方法。 不提供显式方法将导致从超类继承该方法的行为,并且在超类为类的情况下,它将成为Java API规范中针对该类设定的行为。 提供方法的一般约定可以在该类的文档中找到,特别是and 方法的文档。

  • 哈希集由哈希映射支持。从它的JavaDoc: 这个类实现了Set接口,由哈希表(实际上是一个HashMap实例)支持 在查看源时,我们还可以看到它们之间的关系: 因此,一个<code>哈希集 使用而不是,不是更有效吗?进一步考虑的是,如果环境允许使用而不是,我们是否应该完全放弃,直接使用。 触发这些想法的基本问题是以下情况:我有一组具有以下属性的对象: 大型对象集合 如何有效地检查集装箱? 我想到

  • 问题内容: 使用SQL语句时,出于兴趣,我应该始终使用完全限定的列名(tablename.columnname),即使仅使用一个表,例如 问题答案: 如果这样做会更好,因为它不会增加任何复杂性,并且可以防止将来发生错误。 但是,在一个良好定义的系统,你不应该 有 -它就像在编程语言的命名空间。理想的情况是不要有冲突,但是会过多使用显式名称,从而使代码混乱。

  • 问题内容: 实际上,toString方法应返回对象的String表示形式。 在一个项目中,我发现一些类重写了toString方法,从而允许返回null。 喜欢: 对我来说,这种做法违反了toString方法的主要建议,后者应返回对象的String表示形式。 API文档的Object.toString()说: 公共字符串toString() 返回对象的字符串表示形式。通常,toString方法返回一

  • 看过前面的文章,也许有许多朋友已经跃跃欲试想将自己主板上的BIOS升级了(有这种便宜,能不动心吗?)。别心急,我们先来看看升级BIOS的进行过程。首先,你必须知道自己的主板型号;其次,要确认主板上的BIOS的类型和版本;第三,到主板生产商的网页上去下载同自己主板型号和BIOS类型一致的BIOS升级程序;最后,进行BIOS升级操作。在这里,我们先介绍前两个步骤的实现方法。 如何查知电脑的主板类型?

  • 问题内容: 我们的网站目前正在使用jQuery库,每月的访问量约为100万。我们希望包括以API为中心的方法,因此决定转向Javascript MVC并为此选择了angularJS。 现在我的问题是,我应该在Angular顶部使用jQuery,以便我需要重写最少的DOM操作代码,还是应该以Angular方式重写所有内容?我们使用的是jQuery插件,例如plupload,jQuery UI。等在网