- SQL注入
- XSS:Cross Site Script,跨站脚本攻击。原本可缩写成CSS,但为了和网页设计中的CSS区分
- CSRF:Cross Site Request Fake,跨站点请求伪造
https://www.keakon.net/2012/12/03/Tornado%E4%BD%BF%E7%94%A8%E7%BB%8F%E9%AA%8C
https://www.keakon.net/2012/12/03/Tornado%E4%BD%BF%E7%94%A8%E7%BB%8F%E9%AA%8C
http://www.dev120.com/archives/50
其他
最早的时候,我们只需要 GET 和 POST 方法,POST 方法的引入也只是为了消除 URL 过长,参数隐藏,上传文件的问题,完全和语义无关。接触到 RESTful 之后,我们开始思考 GET 和 POST 的不同语义
PATCH vs PUT
PUT
是完整更新,PATCH
是部分更新;PATCH方法是新引入的,对PUT方法的补充,用来对已知资源进行局部更新http://gloveangels.com/restful-http-patch-method/ https://ihower.tw/blog/archives/6483
一切的安全问题都体现在“输入输出”上,一切的安全问题都存在于“数据流”的整个过程中。
web安全问题的本质:输入提交的“特殊数据”,在某个层没处理好,被当作该层的指令,在输出的时候,就会出现相应层的安全问题
精彩举例:
...
service crond restart
/etc/crontab
01 * * * * root run-parts /etc/cron.hourly/
02 4 * * * root run-parts /etc/cron.daily/
22 4 * * 0 root run-parts /etc/cron.weekly/
42 4 1 * * root run-parts /etc/cron.monthly/
用户通过crontab -e
命令编辑,一编辑好的crontab文件放在 /var/spool/cron/
中
* * * * * command
分 时 日 月 周 命令
a, b, c
表示第 a, b, c,... 时间点要执行a-b
表示从第 a 时间点到第 b 时间点这段时间内*/n
表示每 n 个时间间隔执行一次redis作session
redis==2.10.3
open_session
、save_session
class RedisSession(CallbackDict, SessionMixin):
def __init__(self, initial=None, sid=None, new=False):
def on_update(self):
self.modified = True
CallbackDict.__init__(self, initial, on_update)
self.sid = sid
self.new = new
self.modified = False
class RedisSessionInterface(SessionInterface):
serializer = pickle
session_class = RedisSession
def __init__(self, redis=None, prefix='session:'):
if redis is None:
redis = Redis()
self.redis = redis
self.prefix = prefix
def generate_sid(self):
# return str(uuid4())
chars = string.letters + string.digits + "_-"
return "".join([chars[ord(i) % len(chars)] for i in os.urandom(40)])
def get_redis_expiration_time(self, app, session):
if session.permanent:
return app.permanent_session_lifetime
return timedelta(hours=1)
def open_session(self, app, request):
sid = request.cookies.get(app.session_cookie_name)
if not sid:
sid = self.generate_sid()
return self.session_class(sid=sid, new=True)
val = self.redis.get(self.prefix + sid)
if val is not None:
data = self.serializer.loads(val)
return self.session_class(data, sid=sid)
return self.session_class(sid=sid, new=True)
def save_session(self, app, session, response):
domain = self.get_cookie_domain(app)
if not session:
self.redis.delete(self.prefix + session.sid)
if session.modified:
response.delete_cookie(app.session_cookie_name, domain=domain)
return
redis_exp = self.get_redis_expiration_time(app, session)
if isinstance(redis_exp, timedelta):
redis_exp = total_seconds(redis_exp)
val = self.serializer.dumps(dict(session))
self.redis.setex(self.prefix + session.sid, redis_exp, val)
httponly = self.get_cookie_httponly(app)
cookie_exp = self.get_expiration_time(app, session)
response.set_cookie(app.session_cookie_name, session.sid,
expires=cookie_exp, httponly=httponly, domain=domain)
用String:
用Hash
appendfsync always
,保证每次操作都持久到文件中appendfsync everysec
,每秒持久化一次HttpOnly
find
,find /home/ljianhui -user ljianhui
grep
:按行查找文本文件或管道,ls -l | grep -i d
ps
:查看系统进程运行情况;ps aux
查看系统所有的进程数据netstat -anp
:查看端口打开情况
SQL注入
输入-->输出:请求表单或请求查询字符串(数据)中包含了SQL命令(指令),被后台逻辑当成一般请求参数处理,最终达到欺骗服务器执行恶意的SQL命令
典型方式:
SELECT * FROM jobs WHERE job_id = '1' OR '1' = 1'
SELECT COUNT(*) FROM Login WHERE UserName='admin';-- Password='123'
更多案例
应对