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