mysql数据库表user结构如图,php版本5.4.31
$uid="1'; select * FROM user;";
直接用:
$result=mysql_query("select * from user where uid='$uid' ");
mysql_error()显示
`You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select * FROM user;'' at line 1`
和用pdo查询:
$sql="select * from user where uid='$uid' ";
$res=$pdo->query($sql);
显示$res是空
请问大神我构造的mysql注入语句是不是有错...
我主要目的是想测试不同的mysql注入语句,pdo_mysql的防护性
$uid="1'; select * FROM user;";
この種のステートメントは実際にはテストとは何の関係もありませんが、mysql_query("select * from user where uid=1; select * from user")
を直接テストできます。この件については詳しく調べていませんが、2 つのテストは同等であり、両方とも挿入されます。インジェクションの問題の最も単純な例は
$username = "It's test"
ですが、これが実行されると"select * from user where username='It's test"
になり、構文エラーが発生します。 PDO などは前処理によってこのような問題を防ぎます。たとえば、$pdo->query("select * from user where username=?", array("It's test"));
はインジェクションを防ぐために適切にリダイレクトされます。ただし、例で$pdo->query($sql)
を直接使用すると、保護メカニズムは効果を生成しません。これは一般的な考え方ですので、ご自身で理解してください。
最近仕事がとても忙しくて、ほとんどのお誘いを無視しなければならなかったのですが、たまにいくつか返事をしただけで、あまり話す時間がなかったので、ごめんなさいとしか言えませんでした。
Mysql_query、結合された SQL ステートメントは不正です
リーリー単一の ' を閉じる方法を見つけて、次のコードに変更します:
リーリーPDO はクエリの次のステートメントを自動的にエスケープするため、空になります。
リーリー私自身が問題を発見しました:
直接使用
$uid= "888' or '2=2";
ユーザーテーブル全体の内容が公開されました