每当您发现自己无法将某些字符输入数据库时,这强烈暗示您的数据库代码不安全且易受 SQL 注入攻击。你必须退后一步,看的更宽泛一些,思考“有哪些可能的字符没有被正确转义?” 幸运的是,您不必真正知道。您只需要使用内置的转义函数。
理想的解决方案是使用占位符。语法取决于您使用的数据库 API(mysqli 或 PDO;不推荐使用的 mysql 不支持它们)。有很多关于如何使用占位符的优秀资源;这是我从 Google 中提取的第一个结果,它看起来对我来说是正确的。
不太理想的解决方案是将real_escape_string
函数用于您的数据库 API。mysqli
或的示例mysql
:
// Using heredoc syntax, you can clean up your queries like so.
$sql_template = <<<SQL
SELECT
PC.id AS cId,
P.id AS pId
FROM PAGE_CATALOG P
LEFT JOIN PAGE_CATALOG_CONFIG PC ON (PC.id = P.cId)
WHERE PD1.fieldValue = '%s'
AND P.productCode REGEXP '%s'
AND PC.id = '1'
AND P.enabled = '1'
GROUP BY P.id
ORDER BY P.productVolgorde ASC
LIMIT 0, 10
SQL;
// For mysqli:
// $mysqli = new mysqli(...)
$sql = sprintf(
$sql_template,
$mysqli->real_escape_string('{' . $_SESSION['carId'] . '}-{' . $_SESSION['carModelId'] . '}'),
$mysqli->real_escape_string($MAL_TYPE)
);
$result = $mysqli->query($sql);
// For mysql:
$sql = sprintf(
$sql_template,
mysql_real_escape_string('{' . $_SESSION['carId'] . '}-{' . $_SESSION['carModelId'] . '}'),
mysql_real_escape_string($MAL_TYPE)
);
$result = mysql_query($sql);