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