MySQL 安全性:mysql_real_escape_string() 和 mysql_escape_string() 足够吗?
mysql_real_escape_string() 和 mysql_escape_string() 对于应用程序安全性的功效引发了一些争论。虽然这些函数可以防止已知的 SQL 注入向量,但它们的局限性可能会让您容易受到更高级的攻击。
SQL 注入敏感性
尽管使用 mysql_real_escape_string(),您可能会在 PHP 变量集成到查询中的场景中,仍然容易受到 SQL 注入的影响。例如,考虑以下代码:<code class="php">$sql = "SELECT number FROM PhoneNumbers " . "WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);</code>熟练的黑客可以通过以下输入利用此查询:
<code class="php">$field = "1=1" $value = "1"</code>这绕过了预期的逻辑,而是返回(可能)所有记录符合指定条件的人。
喜欢攻击
mysql_real_escape_string() 无法有效防止 LIKE 攻击,例如:<code class="php">$sql = "SELECT number FROM PhoneNumbers " . "WHERE " . mysql_real_escape_string($field) . " LIKE " . mysql_real_escape_string($value);</code>恶意用户可以将 $value 设置为 % 来检索所有记录,从而可能暴露敏感数据.
字符集漏洞
即使在 2011 年,Internet Explorer 仍然容易受到字符集漏洞的攻击。此漏洞可以让攻击者控制您的数据库,类似于 SQL 注入。准备的语句:A主动方法
mysql_real_escape_string() 和mysql_escape_string() 很容易受到攻击,因为它们是反应式防御机制。另一方面,准备好的语句提供了主动的解决方案。通过仅执行有效且已编程的 SQL,准备好的语句可以显着降低意外 SQL 执行的风险,无论底层数据库是否存在漏洞。以下是使用准备好的语句的示例:<code class="php">$statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' . 'WHERE ' . $column . '=? ' . 'LIMIT ' . intval($limit)); $statement->execute(array($value));</code>与使用 mysql_real_escape_string() 相比,准备好的语句既安全又简洁。他们依靠数据库服务器的保护措施来防范已知和未知的威胁。
以上是mysql_real_escape_string() 和 mysql_escape_string() 足以保护 MySQL 应用程序吗?的详细内容。更多信息请关注PHP中文网其他相关文章!