PHP编写的声明澄清

时间:2014-10-13 10:44:00

标签: php

您是否可以安全地将用户输入数据与预定数据中的固定数据混合,或者每个查询条件是否必须有占位符?

例如:

$code = htmlspecialchars($_GET['code']); // USER INPUT DATA
$status = 'A'; // FIXED

$stmt = $connect->prepare("SELECT s_id FROM events WHERE s_code = ? AND s_status = ?") or die(mysqli_error());
$stmt->bind_param('ss', $code, $status);
$stmt->execute();
$stmt->bind_result($reference);

或者这也可以接受吗?

$code = htmlspecialchars($_GET['code']); // USER INPUT DATA

$stmt = $connect->prepare("SELECT s_id FROM events WHERE s_code = ? AND s_status = 'A'") or die(mysqli_error());
$stmt->bind_param('s', $code);
$stmt->execute();
$stmt->bind_result($reference);

2 个答案:

答案 0 :(得分:1)

这两种方法都是可以接受的。显然,从代码中绑定固定值不会对安全性产生影响,但如果应用程序的各个部分(甚至不同的应用程序)对该查询使用不同的硬编码值,则可能会有一些性能优势。

答案 1 :(得分:1)

为了补充Mureinik提供的答案,您还应该关注用户输入。准备好的语句可以有效地防止SQL注入攻击,但它们不是针对所有类型攻击的通用解毒剂。

根据你的例子,我会说你希望$_GET['code']是一个整数。作为额外的安全层,您可以(并且应该)清理并验证用户输入。这些方面的东西:

// avoid accessing directly super-globals like $_GET, $_POST
// @see Sanitize filters: http://nl1.php.net/manual/en/filter.filters.sanitize.php
$code = filter_input(INPUT_GET, 'code', FILTER_SANITIZE_NUMBER_INT);

// @see Validate filters: http://nl1.php.net/manual/en/filter.filters.validate.php
$options = array(
    'options' => array(
        'min_range' => 1,
        'max_range' => 1000000,
));

if (!filter_var($code, FILTER_VALIDATE_INT, $options)) {
    echo 'Invalid code!';
}