GET参数容易受到SQL注入-PHP

| 我被要求处理另一个程序员设置的站点的安全问题。到目前为止,我还没有看到任何代码,因此我现在不做任何假设,而是希望涵盖基础知识。该站点的托管组进行了安全检查,发现他们的代码容易受到SQL注入的攻击。 示例:www.example.com/code.php?pid=2&ID=35(GET参数ID容易受到SQL注入的攻击) 现在,因为我是新手,所以我已经解释说我可以通过主机解决问题,但是仍然需要由对安全性有更深入了解的人员来查看其站点。 因此,为了照顾潜在的SQL注入(并且无需查看代码),我将使用mysql_real_escape_string:
$query = sprintf(\"SELECT * FROM table WHERE pid=\'%s\' AND ID=\'%s\'\",
            mysql_real_escape_string($pid),
            mysql_real_escape_string($id));
另外,我会考虑mysqli_real_escape_string和准备好的语句,但是我不知道它们是如何配置的。但是mysql_real_escape_string是否可以处理潜在的SQL注入?
已邀请:
如果可以,请跳过旧的
mysql_*
内容并使用PDO。
$pdo = new PDO(\'mysql:host=localhost;dbname=whatever\', $username, $password);

$statement = $pdo->prepare(\'SELECT * FROM table WHERE pid=:pid AND ID=:id\');

$statement->bindParam(\':pid\', $_GET[\'pid\']);

$statement->bindParam(\':id\', $_GET[\'id\']);

$results = $statement->execute();

var_dump($results->fetchAll());
该函数应该很好-您的变量在SQL语句中的单引号内,并且任何单引号或双引号都将转义。 这意味着没有一个变量可以“突破”语句。
是的,mysql_real_escape_string()将转义任何潜在的危险字符。如果您知道参数是数字的,那么使用is_numeric()进行验证也不会有任何伤害。 您还应该查看mysql :: prepare-这将确保仅执行1条语句,并防止其他SQL漏洞。
如果ID和PID是整数字段,为什么不将它们强制转换为int。 这样,您肯定会有一个数字,没有SQL注入:
$pid = (int) $pid;
$id = (int) $id;
没关系,但是我总是建议您使用准备好的语句。

要回复问题请先登录注册