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;
,没关系,但是我总是建议您使用准备好的语句。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...