2017-09-26 16 views
0

したがって、私はPDOプリペアドステートメントがSQLインジェクションとエスケープから保護すべきであると理解しています。しかし、私が次のことを試みたとき...PDOでのエスケーププリペアドステートメントパラメータ

if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["id"])) 
{ 
    $id = $_POST["id"]; 
    //$id = "2' AND name='Entry2"; 
    $someinfo = "updated"; 

    ...DB Stuff... 

    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $dbpassword); 

    $stmt = $conn->prepare("UPDATE testdb SET info=:someinfo WHERE id=:id"); 

    $stmt->bindParam(':id', $id); 
    $stmt->bindParam(':someinfo', $someinfo); 
    $stmt->execute(); 

    $conn = null; 

    exit(); 
} 

次に、id = 2とname = entry2の行が更新されます。これは他のSQLクエリにエスケープするために使用することができるようになりましたが、この種のエスケープが本当に損害を与えないようにするための予防措置を講じることができます。しかし、私は、SQLクエリーパラメータの予期しない変更を避けるためのエスケープを防ぐ他の方法がないことを確かめたいと思っていました。 (注目すべきことに、私はSQLiでも同様のことを試してみたのと同じ結果が得られました)

私には何か不足していますか?それともPrepared Statementsの仕組みでもあります。

+0

[非常に関連しています](https://security.stackexchange.com/questions/15214/are-prepared-statements-100-safe-against-sql-injection) – Script47

+3

ドキュメントhttp ://php.net/manual/en/pdo.prepared-statements.php(まだ行っていない場合) –

+0

誤解があるようです。これが起こるかどうか疑問に思っていません。これは私の説明とまったく同じように起こっています。多分私はビデオを作りますか? –

答えて

2

もう少し周りを見た後、この行動は雄弁に説明した/ここに私のために解決: https://phpdelusions.net/pdo#comment-277

それはそれは、文字列をエスケープが、代わりにちょうど脱出するように見える作られた整数の後に入力を切り捨てていないが判明文字列私はコードを修正するときにこれを確認することができました。