GET参数易受SQL注入攻击 - PHP

时间:2011-04-19 12:44:05

标签: php mysql security sql-injection

我被要求处理由另一位程序员设置的网站的安全问题。到目前为止,我还没有看到任何代码,所以我在这一点上做了假设,我想覆盖我的基础。托管该站点的组进行了安全检查,发现他们的代码容易受到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注入吗?

5 个答案:

答案 0 :(得分:5)

如果可以,请跳过旧的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());

答案 1 :(得分:2)

该函数应该正常 - 您的变量在SQL语句中的单引号内,并且任何单引号或双引号都将被转义。

这意味着没有任何变量能够“突破”该陈述。

答案 2 :(得分:1)

是的,mysql_real_escape_string()将逃避任何潜在的危险字符。如果您知道参数是数字的,那么使用is_numeric()

来验证它也不会有什么坏处

您还应该查看mysql::prepare - 这将确保只执行1条语句,并防止其他SQL漏洞。

答案 3 :(得分:1)

如果ID和PID是整数字段,为什么不将它们转换为int

这样,你肯定有一个数字,没有SQL注入:

$pid = (int) $pid;
$id = (int) $id;

答案 4 :(得分:0)

这应该没问题,但我总是建议使用准备好的陈述。

相关问题