0

重複の可能性:
PHPでSQLインジェクションを防ぐ方法は?

私はこのコードを持っています

$where = '';
if (isset($_POST['lvl']) && $vals = $_POST['lvl']) {
    $where = 'WHERE ';
$first = false;
if ($vals[0] === '0') {
    $where .= 'team = "neutral"';
    unset($vals[0]);
    $first = true;
}
if (count($vals)) {
    if ($first) $where .= ' OR ';
    $where .= 'lvl IN (\'' . implode('\',\'', $vals) . '\')';
}}
    $sql = "SELECT * FROM $table $where";
$res = $DBH->prepare($sql);
$res->execute();
$num = $res->rowCount();
echo "<h2>".$num."</h2>";

それは機能しますが、誰かが何かをした場合、これは起こります。これを修正する方法は?

UPD:追加されたPDOコード

4

3 に答える 3

0

mysqli_real_escape_string()値をエスケープするには、PHPを使用します。関数が減価償却されているmysqliためであることに注意してください。mysql

于 2013-01-26T06:01:42.520 に答える
0

すべての文字列値にPDO::quote()を使用する必要があります。
また、カウントするだけでよい場合は、すべてのレコードを選択しないでください。データベースに依頼してください

$where = '';
if (!empty($_POST['lvl'])) {
    $vals = $_POST['lvl'];
    $where = 'WHERE ';
    if ($vals[0] === '0') {
        $where .= "team = 'neutral'";
        unset($vals[0]);
        if ($vals) {
            $where .= " OR ";
        }
    }
    if ($vals) {
        foreach ($vals as $i => $val) {
           $vals[$i] = $DBH->quote($val);
        }
        $where .= "lvl IN (".implode(',', $vals).")";
    }
}
$sql = "SELECT count(*) as cnt FROM $table $where";
$res = $DBH->query($sql);
$res->execute();
$row = $res->fetch();
echo "<h2>".$row['num']."</h2>";

ちなみに、私自身のクラスでは、手動でのエスケープが不要になるため、コードは少し複雑ではなくなります(ただし、PDOではなくmysqliを使用しています)。

$where = '';
if (!empty($_POST['lvl'])) {
    $vals = $_POST['lvl'];
    $where = 'WHERE ';
    if ($vals[0] === '0') {
        $where .= "team = 'neutral'";
        unset($vals[0]);
        if ($vals) {
            $where .= " OR ";
        }
    }
    if ($vals) {
        $where .= $db->parse("lvl IN (?a)",$vals);
    }
}
$num = $db->getOne("SELECT count(*) as cnt FROM ?n ?p",$table, $where);
echo "<h2>".$num."</h2>";
于 2013-01-26T07:00:28.267 に答える
-1

名前付きパラメーターでPDOを使用する

http://php.net/manual/en/pdo.prepared-statements.php

于 2013-01-26T06:09:47.843 に答える