

PHPにSQLインジェクション対策をしたいのですが、

[code]

    "SELECT * FROM hogehoge WHERE id = '$id' AND number = '$data'
    
[/code]

というSQL文を組み立てる場所で、idには引数として整数が入るので文字列リテラルで対策出来ますが、dataには  
`>>整数`  
という引数を渡すので、文字列リテラルでは対策出来ないという状況に陥っています。  
どうすればいいですか?

追記

[code]

    $dbh->query("SET NAMES 'hogehoge'");
    $sql = "SELECT * FROM replys WHERE id = ? AND data = ?";
    $sth = $dbh->prepare($sql,array('integer'),array('string'));
    $sth->execute(array($id),array($data));
    
[/code]

というコードですが、$dataに`>>整数`を引数として渡すと、弾かれます。


CC BY-SA 4.0
2019-09-26T06:57:00.933
59286
2019-09-30T10:38:20.950
2019-09-30T03:55:41.003
35975
35975
question
php mysql sql security
PHPでのSQLインジェクション対策


質問の意味が正確に理解できませんでしたが、参考サイトにもあるようにSQLインジェクションの一般的な対策はプリペアドステートメントを使うことです。プリペアドステートメントを使用しなくても、SQLの可変部分に対する入力値を適切にチェックした上でセットするようにすれば、問題ありませんが、場合によっては適切にチェックすることは簡単ではないため、プリペアドステートメントを使用することをお勧めします。


CC BY-SA 4.0
2019-09-26T11:22:33.983
59297
2019-09-26T12:58:17.617
2019-09-26T12:58:17.617
21092
21092
59286
answer


追記の部分、私が見たことのない構文なのですが、MySQLiでしょうか、PDOでしょうか?それとも全く別の何かのフレームワークを使っておられるのでしょうか?

とりあえずPDOだと仮定する([`PDO::prepare`](https://www.php.net/manual/en/pdo.prepare.php)のページと変数の使い方が似ているので)と、書き方が根本的におかしいです。

[code]

    $sql = "SELECT * FROM replys WHERE id = ? AND data = ?";
    $sth = $dbh->prepare($sql);
    $sth->execute([$id, $data]);
    
[/code]

あなたの使われている枠組みによっては、全く役に立たないかもしれません。その場合には、きちんとご自身の使われている枠組みをご説明ください。また、うまくいかない場合には「弾かれます」といった曖昧な表現を使われると、読んでいる人間には一体何が起こったのかがさっぱり伝わりません。エラーメッセージなどの重要な情報を必ずお示しください。


CC BY-SA 4.0
2019-09-30T10:38:20.950
59362
2019-09-30T10:38:20.950
13972
59286
answer