2011-04-19 60 views
3

我被要求处理由另一个程序员设置的站点的安全问题。到目前为止,我还没有看到任何代码,所以在这一点上我不想做任何假设,我想要介绍我的基础。托管该站点的组运行安全检查,发现他们有易受SQL注入攻击的代码。GET参数容易受到SQL注入 - PHP

实施例: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注入吗?

+2

你最好用准备好的语句。 – JohnP 2011-04-19 12:45:32

回答

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

对PDO +1,现在不应该使用mysql_ *函数。 – Arkh 2011-04-19 13:13:56

2

该功能应该罚款 - 你的变量是在SQL语句中单引号里面,任何单一或双引号将被转义。

这意味着没有一个变量可以“爆发”该语句。

1

是的,mysql_real_escape_string()将转义任何潜在的危险字符。如果您知道参数是数字的,那么验证此功能并不会造成影响is_numeric()

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

0

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

1

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

这样的话,你一定有一个号码,没有SQL注入:如果你能

$pid = (int) $pid; 
$id = (int) $id; 
相关问题