mysql_real_escape_string() 和 mysql_escape_string() 足以保证应用程序安全吗?
尽管如此虽然这些函数用于清理用户输入的盛行,但人们仍然担心它们在防范 SQL 攻击和潜在漏洞方面的局限性。
SQL 注入仍然是一个威胁:
mysql_real_escape_string( )主要是为了防止标准 SQL 注入。但是,它对高级注入技术提供的保护有限。
考虑以下代码:
$sql = "SELECT * FROM users WHERE username = '" . mysql_real_escape_string($username) . "'";
攻击者仍然可以通过利用表或列名称来执行注入,如下所示:
$username = "'); DROP TABLE users; --";
LIKE SQL 攻击:
LIKE SQL此功能的注入也容易受到攻击。例如,攻击者可以:
$data = '%'; $sql = "SELECT * FROM users WHERE username LIKE '" . mysql_real_escape_string($data) . "%'"; # Can retrieve all results
Unicode 字符集漏洞:
尽管 HTML 配置正确,但字符集漏洞可以授予攻击者广泛的控制权。
LIMIT 字段漏洞利用:
转义 LIMIT 字段还可以让攻击者检索未经授权的数据:
$sql = "SELECT * FROM users LIMIT '" . mysql_real_escape_string($limit) . "'"; # Can retrieve all results
准备语句作为稳健的替代方案:
数据库安全的理想解决方案是使用准备好的语句。准备好的语句在服务器端执行 SQL 查询,防止执行意外的 SQL。考虑这个例子:
$statement = $pdo->prepare("SELECT * FROM users WHERE username = ?"); $statement->execute(array($username));
通过使用准备好的语句,您可以利用 SQL Server 的保护机制,并防止已知和未知的攻击。
以上是`mysql_real_escape_string()` 和 `mysql_escape_string()` 足以防止 SQL 注入攻击吗?的详细内容。更多信息请关注PHP中文网其他相关文章!