虽然大部分可以在网上解释,但我感觉要解释得更详细一点。
如果你能想象字符串会变成什么,你就会明白你正在编写的脚本的潜在风险,因为它会在实际运行之前变成其他东西。
一个简单的恶意示例:
$fromtheuser = "foo'; DROP TABLE affiliates; --";
$q = "SELECT id FROM affiliates WHERE website = '$fromtheuser'";
你能解释一下这会变成什么吗?开发商做不到。
"SELECT id FROM affiliates WHERE website = 'foo'; DROP TABLE affiliates; --'"
这个向量的关键部分是 '; 用于结束 SQL 字符串原语,--' 用于注释掉推送的引号。
您将在编写的代码中寻找的是,在将数据放入查询之前对其进行适当的清理和过滤。帮助保护这方面安全的一个重要工具是某种形式的准备好的查询,在这种情况下,您可以将参数绑定到查询,这样就没有什么可操作的了。
我们可以通过 MySQLi(改进的)或我个人最喜欢的 PDO 中的预处理语句来实现这一点。快速了解它们的外观。
mysql_real_escape_string(可以处理编码和引号)
<?php
$clean = mysql_real_escape_string($q)
MySQLi:
<?php
$clean = $mysqli->prepare("SELECT id FROM affiliates WHERE website = ?");
$clean->bind_param('s', $website); //'s' for 'string'
PDO:
<?php
$clean = $pdo->prepare("SELECT id FROM affiliates WHERE website = ?");
$clean->bindParam(1, $website); //you can use :site rather than ? and 1