元のSQL文が以下の場合、
SQL
1SELECT * FROM Orders_Pend WHERE Location_City = 'Orlando'
前提として Orland が外部から入力された文字列だとして、テーブル Orders_Pend を削除する場合、Orlandの代わりに、以下を入力すると、
SQL
1'; DROP TABLE Orders_Pend
生成されるSQL文は下記となります。
SQL
1SELECT * FROM Orders_Pend WHERE Location_City = ''; DROP TABLE Orders_Pend'
これは途中までは良いのですが、末尾のシングルクォート「'」の箇所で構文エラーになります。この文字は元々のSQL文にあるものなので、削除はできません。なので、これを活かしつつ、SQLの構文エラーにならない方法を考える必要があります。
例えばDROP TABLEではなくDELETEでよいならば、以下を外部から入力すると、
SQL
1'; DELETE FROM Orders_Pend WHERE ''='
以下のSQL文が生成されるので、第2のSQL文(DELETE FROM ...)の結果、Orders_Pend は空になります。しかし、中身が消えるだけでテーブル自体削除はされません。
SQL
1SELECT * FROM Orders_Pend WHERE Location_City = ''; DELETE FROM Orders_Pend WHERE ''=''
ここでSQLコメントの登場です。標準SQLでは、「--」ですが、MySQLでは「#」も使えます。これらの記号以下は、コメントとして無視されます。
なので、以下を入力すると
SQL
1'; DROP TABLE Orders_Pend --
生成されるSQL文は下記となります。
SQL
1SELECT * FROM Orders_Pend WHERE Location_City = ''; DROP TABLE Orders_Pend -- '
末尾の「-- '」はコメントとして無視されます。ここで--の後に空白を入れているのは、MySQLの場合、--の後に空白がないとコメントとして認識されないからです。#記号の場合は、空白は必要ありません。
シングルクオテーションが1個しかないため、= Orlandoが成立せず、結局文字列として認識されることが無い。理解されるコマンドとしては ;で仕切りなおして、DROPコマンド以下だけになる。だからテーブルが削除されてしまう。
この理解は間違いです。当該箇所でSQLの構文エラーになり、DROP以下も含めてSQLは実行されません。これは元記事の間違いでしょう。
-- の役割とは何でしょうか?
既に指摘があるように、これはSQLのコメントを意味します。