Closed smptmhr closed 2 years ago
rails console
上でタスクを更新
入力
task.update(name: "updated in console")
=> UPDATE "tasks" SET "name" = $1, "updated_at" = $2 WHERE "tasks"."id" = $3
[["name", "updated in console"], ["updated_at", "2022-05-26 02:50:38.750979"], ["id", 45]]
UPDATE テーブル名 SET カラム名1 = 値1 ( , カラム名2 = 値2 , ...) WHERE 条件;
WHERE 条件
がないと全レコードが更新される。
Task.all
=> SELECT `tasks`.* FROM `tasks`
SELECT : 探したい列を指定 FROM : どのテーブルから探すか指定
Task.find(1)
=> SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
LMIT : 取得するレコードの上限数
Task.find([1,2,3])
SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" IN ($1, $2, $3) [["id", 1], ["id", 2], ["id", 3]]
IN : or句を一つにまとめて書ける この二つは同じ意味
SELECT "tasks".* FROM "tasks"
WHERE "tasks"."id"= 1
OR "tasks"."id"= 2
OR "tasks"."id"= 3
SELECT "tasks".* FROM "tasks"
WHERE "tasks"."id" IN (1, 2, 3)
NOT IN
というものもあるが、これは全レコードを見に行き、重い処理になりがちなので注意。
rails console
上でタスクを削除
task.delete
=>DELETE FROM "tasks" WHERE "tasks"."id" = $1 [["id", 68]]
DELETE : 対象のレコードを削除する
レコード削除後にtask.valid?
をすると問題なくレコードとtrue
が返ってくるのが謎。
indexページではタスクが削除されている。
アプリにSQLとして意味のある文字列を送り、データベースに不正にアクセスする攻撃。サーバー側では正常なSQLとして実行されてしまう。
例えば
Project.where("name = '#{params[:name]}'")
というコードに対して' OR 1 --
という文字列を送ると以下のSQLが実行される。
SELECT * FROM projects WHERE name = '' OR 1 --'
このSQLによってprojectsテーブルから全てのレコードが取り出されてしまう。
Ruby on Railsには、特殊なSQL文字をフィルタするしくみが組み込まれており、「'」「"」「NULL」「改行」をエスケープします。Model.find(id)やModel.findby*(引数)といったクエリでは自動的にこの対策が適用されます。ただし、SQLフラグメント、特に条件フラグメント(where("..."))、connection.execute()またはModel.find_by_sql()メソッドについては手動でエスケープする必要があります。
条件オプションに文字列を直接渡すのではなく、引数のように渡すことで無害化できる。
Model.where("zip_code = ? AND quantity >= ?", entered_zip_code, entered_quantity).first
口頭でsqlインジェクションの説明もらったのでOK
レコード作成
rails console
上でタスクを作成 入力INSERT文 : どのようなデータをどのテーブルに登録するか
文法
BEGINはトランザクションブロックを初期化する。
INSERT分の基本構文
これはおそらく
に対応しているように見える、調べたけどあまり分からなかった。
これによって
#<Task:0x00000001158bc660
が返ってきているindexページ
タスクが作成されていることを確認