【问题标题】:Do I need to escape every string and what is the maximum length of an escaped string?我需要转义每个字符串吗?转义字符串的最大长度是多少?
【发布时间】:2015-05-30 05:54:11
【问题描述】:

我正在尝试使用 SQL 将随机生成的盐存储在我的数据库中。我已经使用这行代码在 php 中生成了这个盐:

$salt = mysqli_real_escape_string($this->connection, mcrypt_create_iv(256, MCRYPT_DEV_URANDOM));

据我了解,所有字符串都必须转义,无论它们是否来自用户输入,因为我的随机盐也可能包含干扰 SQL 的特殊字符,无论它们是否是故意恶意的?据我所知,要转义字符串 PHP 需要添加额外的字符,从而增加字符串的长度。我想知道转义后字符串的最大长度是多少?字符串中的每个侵权字符是否只添加一个字符,因此对于我的 256 个字符的字符串,字符串的最大长度为 512?

谢谢

【问题讨论】:

  • 不要逃跑。请改用绑定参数。
  • 你真的不应该在密码哈希上使用你自己的盐,你真的应该使用 PHP 的 built-in functions 来处理密码安全。
  • @JayBlanchard 使用盐散列密码,您需要能够存储盐。据我所知,使用内置 PHP 函数存储盐的唯一方法是生成自己的,这就是我在这里所做的。此外,我正在使用 hash_pbkdf2 函数,它比 PHP 散列函数更安全,因为您可以执行任意数量的迭代。使用 PHP 函数肯定是低于标准的吗?
  • 不,那是不正确的。 PHP 提供的密码散列函数为每个散列生成一个随机盐更安全。您可以通过向函数添加选项来修改成本(迭代)。请记住,您需要为您的系统找到理想的成本,但通常默认值的效果非常好,而无需您的服务器需要额外的计算。
  • 但是我不需要储存盐吗?我看不到该功能的任何方式输出盐而不自己生成和存储它?谢谢

标签: php string salt mysql-real-escape-string


【解决方案1】:

不要逃避。请改用bind parameters

除此之外,重要的大小是未转义的值。转义只是为了让解析器可以安全地读取字符串。实际的字符串值仍然是相同的大小(并且将由 MySQL 引擎以未转义的形式处理)。转义只是在查询中安全地嵌入值的一种方式。

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 2010-12-16
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多