”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 `mysql_real_escape_string()` 和 `mysql_escape_string()` 足以保护您的应用程序吗?

使用 `mysql_real_escape_string()` 和 `mysql_escape_string()` 足以保护您的应用程序吗?

发布于2024-12-22
浏览:967

Is Using `mysql_real_escape_string()` and `mysql_escape_string()` Enough to Secure Your Application?

mysql_real_escape_string() 和 mysql_escape_string() 足以保证应用安全吗?

虽然这些函数可以提供一些针对 SQL 注入和其他攻击的保护,他们未能解决某些漏洞。

SQL如果您在查询中不正确地处理 PHP 变量,注入

Mysql_real_escape_string() 仍然可以将您的应用程序暴露于 SQL 注入。考虑以下示例:

$sql = "SELECT number FROM PhoneNumbers WHERE " . 
        mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);  

攻击者可以操纵此查询来执行未经授权的 SQL 语句,因为 mysql_real_escape_string() 并非旨在保护表名、列名或 LIMIT 字段。

类似攻击

Mysql_real_escape_string() 不足以防止 LIKE 漏洞。攻击者可以输入“%%”等恶意值来返回所有记录,从而可能泄露敏感信息。

字符集漏洞

某些浏览器可能容易受到字符集的攻击漏洞利用,允许攻击者注入绕过转义机制的恶意字符并执行任意 SQL 命令。

准备语句:A综合解决方案

为了有效保护您的应用程序,建议使用准备好的语句而不是 mysql_real_escape_string()。准备好的语句通过将用户提供的值绑定为参数来执行 SQL 查询。这消除了手动转义的需要,并确保只执行授权的 SQL。

下面是在 PHP 中使用准备好的语句的示例:

$pdo = new PDO($dsn);

$column = 'url';
$value = 'http://www.example.com/';
$limit = 1;

// Validate the search parameter column.
$validColumns = array('url', 'last_fetched');
if (!in_array($column, $validColumns)) { $column = 'id'; }

$statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' .
                           'WHERE ' . $column . '=? ' .
                           'LIMIT ' . intval($limit));
$statement->execute(array($value));
while (($data = $statement->fetch())) { }

Prepared statements 通过利用底层数据库服务器的安全功能提供主动防御机制。它们本质上能够抵抗已知和未知的攻击,从而确保数据的完整性。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3