【发布时间】:2017-01-05 01:55:30
【问题描述】:
在 Postgres High (PSD 9.6) 中,书呆子和欢乐合唱团陷入了一场奇怪的相互依赖的战争。书呆子们密谋反对欢乐合唱团的秘密计划。欢乐合唱团以悦耳的歌曲回应。
如果书呆子懦弱,欢乐合唱团永远不会回应。同样,书呆子只是想激怒欢乐合唱团,所以如果欢乐合唱团没有回应,书呆子实际上不会援引他们的秘密计划。
作为首席程序员,我的工作是确保一次只发生一次可能的书呆子叛乱尝试。我还必须确保书呆子都成功了,欢乐合唱团也成功了,或者都不成功。但是那些 麻烦的书呆子,总是尝试sql注入攻击。也得阻止。就像 Postgres High 的所有优秀领导者一样,我们用 SQL 编写课程计划。
课程计划:
begin;
-- stop race conditions with a hall monitor
select from semaphore where name = 'hall_monitor' for update;
prepare nerd_rebellion (
text, -- secret_mission
date -- when_we_strike
) as
update ultimate_plan
set secret_mission = $1
where when_we_strike = $2;
prepare glee_club_counterstrike (
text, -- happy_song
boolean -- kill_them_with_love
) as
insert into song_therapy (
happy_song,
kill_them_with_love
) values (
$1,
$2
)
execute nerd_rebellion(
'Nerds do stuff like this ; drop table song_therapy --f you glee club',
'2017-01-01'
);
execute glee_club_counterstrike(
'god_bless_america',
true
);
-- let us never speak of this again ...
deallocate nerd_rebellion
deallocate glee_club_counterstrike
-- all done. Release the hall monitor
commit;
天哪,校长要做的事情太多了。我们的课堂时间很短,我们有所有这些准备和分配。啊。真的减少了我的咖啡和甜甜圈时间。但是我需要将多个语句包装在一个事务中并使用信号量进行序列化。也不能在 SQL 注入上妥协。我没有看到更简单的解决方案。你?
【问题讨论】:
-
人们不明白,这可能很快就会关闭。不过,我喜欢这个问题。
标签: sql postgresql concurrency transactions