安全警告:此答案不符合安全最佳实践。转义不足以防止SQL注入,请改用准备好的语句。
SQL语句中转义特殊字符的一些准则。
不要使用MySQL。此扩展已弃用。请改用MySQLi或PDO。
MySQLi
对于手动转义字符串中的特殊字符,可以使用mysqli_real_escape_string函数。除非使用mysqli_set_charset设置了正确的字符集,否则该函数将无法正常工作。
例子:
$mysqli = new mysqli('host', 'user', 'password', 'database');
$mysqli->set_charset('charset');
$string = $mysqli->real_escape_string($string);
$mysqli->query("INSERT INTO table (column) VALUES ('$string')");
要使用准备好的语句自动转义值,请使用mysqli_prepare和mysqli_stmt_bind_param,其中必须提供相应绑定变量的类型以进行适当的转换:
例子:
$stmt = $mysqli->prepare("INSERT INTO table (column1, column2) VALUES (?,?)");
$stmt->bind_param("is", $integer, $string);
$stmt->execute();
无论您使用prepared语句还是mysqli_real_escape_string,您都必须知道正在使用的输入数据的类型。
因此,如果使用准备好的语句,则必须指定mysqli_stmt_bind_param函数的变量类型。
正如名字所说,mysqli_real_escape_string的使用是为了转义字符串中的特殊字符,因此它不会使整数安全。此函数的目的是防止破坏SQL语句中的字符串,以及它可能对数据库造成的损坏。如果使用得当,mysqli_realescape_string是一个有用的函数,尤其是与sprintf结合使用时。
例子:
$string = "x' OR name LIKE '%John%";
$integer = '5 OR id != 0';
$query = sprintf( "SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string($string), $integer);
echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 5
$integer = '99999999999999999999';
$query = sprintf("SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string($string), $integer);
echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 2147483647