几个小时前, 我的服务器在跑STEEMSQL的时候再也联不上了:
conn = pymssql.connect(host, username, password, database) File "pymssql.pyx", line 641, in pymssql.connect (pymssql.c:10824) pymssql.OperationalError: (20009, b'DB-Lib error message 20009, severity 9:\nUnable to connect: Adaptive Server is unavailable or does not exist (sql.steemsql.com:1433)\nNet-Lib error during Connection timed out (110)\n')
我以为是暂时的问题, 直到我发现我其它三台VPS服务器甚至是LINQPAD都没有问题, 我才意识到可能我的IP地址被禁掉了. 于是我联系了STEEMSQL的作者 @arcange 他说:
Several IP addresses have been blocked because queries issued are considered as SQL Injection attempts by the IPS. You IP address is being blocked by my IPS (Intrusion Prevention System) because the SQL queries you issue are considered as SQL Injection exploit: `EXPLOIT MS-SQL SQL Injection closing string plus line comment, proto:TCP, ip/port:XXX.XXX.XXX.XXX
是的, 我有很多基于 STEEMSQL 的在线工具 也许是哪个坏蛋特意输入这样的字符串:
1 | '; DROP TABLE Comments; GO;-- |
'; DROP TABLE Comments; GO;--
带有这样的SQL语句会被认为是恶意的请求, 于是服务器把IP给禁用了.
有两种办法, 第一种是过滤SQL参数, 如
1 | SELECT field FROM table WHERE author = @account |
SELECT field FROM table WHERE author = @account
这样就可以防止这个语句
1 | SELECT author FROM Comments WHERE author ='{0}' |
SELECT author FROM Comments WHERE author ='{0}'
被替换成:
1 | SELECT author FROM Comments WHERE author =''; DROP TABLE Comments; GO;--' |
SELECT author FROM Comments WHERE author =''; DROP TABLE Comments; GO;--'
如果用户输入的是
1 | '; DROP TABLE Comments; GO;-- |
'; DROP TABLE Comments; GO;--
我们知道, 一个有效的STEEM ID是由小写字母, 数字, 减号还有点号构成, 所以我们可以在PYTHON里这么检查:
1 2 3 4 5 6 | def valid_id(s): if len(s) == 0: return False for i in s: if not (i.islower() or i.isdigit() or i == '-' or i == '.'): return False return True |
def valid_id(s): if len(s) == 0: return False for i in s: if not (i.islower() or i.isdigit() or i == '-' or i == '.'): return False return True
或者在 PHP 最好的语言里用正则表达式这样检查(上面的PYTHON也可以用正则 import re 但是我比较不爽的是这个 import 哪有PHP内置的好用? ).
1 2 3 4 5 6 7 | function isValidId($str) { $str = trim($str); if (preg_match('/^[a-z0-9\-\.]+$/', $str)) { return 1; } return 0; } |
function isValidId($str) { $str = trim($str); if (preg_match('/^[a-z0-9\-\.]+$/', $str)) { return 1; } return 0; }
加了检查后, 下次再有人恶意的查询, 我的API服务器就会返回 503 Service Temporarily Unavailable 而不会去访问 STEEMSQL服务器, 减少了无效的网络请求.
STEEM SQL 系列教程
- STEEM SQL 系列教程之 随机返回是怎么实现的?
- STEEM SQL 系列教程之 如何获取最近7天 CN 区用户发贴量, 点赞数和估计收益值?
- STEEM SQL 系列教程之 历史上的今天怎么实现的?
- STEEM SQL 系列教程之 每个月能挣多少?
- STEEM SQL 系列教程之 真的可以恢复删除的文章或评论么?
- STEEM SQL 系列教程之 大鱼们都给谁投票了?
- STEEM SQL 系列教程之 办银行一个月共发了多少利息?
- STEEM SQL 系列教程之 你的哪些好友已经好久没玩STEEM了?
- STEEM SQL 系列教程之 如何使用 ISJSON 和 JSON_VALUE 函数?
- STEEM SQL 系列教程之 如何获取史上赚最多金的作者?
- STEEM SQL 系列教程之 一鸣惊人的作者
- STEEM SQL 系列教程之 如何避免 SQL 注入?
- STEEM SQL 系列教程之 我花了800多 SBD (7000多美元)买赞
- STEEM SQL 系列教程之 怎么样查看 STEEMSQL 是否数据同步完全?
英文: SteemSQL: How to Avoid SQL Injection?
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK