使用PDO准备语句不是很久以前开始,而且,据我所知,它所有的转义/安全为您服务。
例如,假定$ _POST [“标题”]是一个形式字段。
$title = $_POST['title'];
$query = "insert into blog(userID, title) values (?, ?)"
$st = $sql->prepare($query);
$st->bindParam(1, $_SESSION['user']['userID'], PDO::PARAM_INT);
$st->bindParam(2, $title);
$st->execute();
这是真的安全吗? 我必须要做什么吗? 我有什么别的考虑?
谢谢。
严格说来,实际上没有逃脱需要,因为参数值永远不会插值到查询字符串。
该方式的查询参数的工作原理是,将查询发送到数据库服务器时,你叫prepare()
和参数值后发送,当你打电话execute()
因此,他们不停地从查询的文本形式分开。 从未有SQL注入的机会(前提是PDO::ATTR_EMULATE_PREPARES
是假的)。
所以,是的,查询参数帮助您避免安全漏洞,它的形式。
他们是反对任何安全漏洞100%的证据? 不,当然不。 正如你可能知道,查询参数只需要一个字面值的地方在SQL表达式。 你不能为值的列表,例如一个参数的替代品:
SELECT * FROM blog WHERE userid IN ( ? );
不能使用参数,使表名或列名动态:
SELECT * FROM blog ORDER BY ?;
你不能用一个参数的任何其他类型的SQL语法:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
因此,有相当那里你必须处理查询作为一个字符串,之前的几个案件prepare()
调用。 在这种情况下,你仍然需要仔细编写代码来避免SQL注入。
关于SQL注入,我相信这是你能得到最安全的,特别是如果你使用像PDO :: PARAM_INT常数。
为XSS提到来看,我认为这也很好地看看使用的东西,如该输入清洁类http://www.phpclasses.org/browse/package/2189.html防止XSS攻击。