在我的网站上,我有一个名为$user_data
包含表单输入的变量.然后我在用户页面上显示此变量(通过echo).
使用此变量避免任何安全风险的最佳方法是什么?我用strip_tags()
,但还不够.
此变量也会保存到MySQL数据库中.
为避免严重的安全问题,您必须做两件非常重要的事情.
在将其放入SQL查询之前,您需要转义用户输入.转义意味着逃避所有特殊字符,如'
; 幸运的是,有一个功能已经自动完成:mysql_real_escape_string.
如果你不逃避用户输入,可能会发生令人讨厌的事情.想象一下,你的查询是INSERT INTO userdata VALUES ('$user_data')
.现在想象一下用户写的'; DROP DATABASE userdata;
.
如果你不逃避它,你的查询将变为:INSERT INTO userdata VALUES (''; DROP DATABASE userdata;')
.你可以想象这并不好:如果你启用了多个语句,你可以亲吻你的数据库.这称为SQL注入攻击.
当您将变量输出给用户时,还需要使用HTML实体正确替换HTML特殊字符.幸运的是,还有一个功能:htmlspecialchars().它将转换特殊的HTML字符,如<
to <
.
这似乎是一个经常被低估的问题,但实际上它是非常严重的.想象一下,如果$user_data
包含.它可以利用用户浏览器中的现有漏洞,或者它可以向攻击者发送非HTTPOnly cookie(可能包含已保存的密码),或者它可以欺骗用户在通过操纵操作生成的表单上写入密码DOM(可能在javascript中),或许多其他坏事.
这称为XSS(跨站点脚本).
mysql_real_escape_string
在将字符串插入SQL查询之前调用该字符串(但不是在echo
它时).
htmlspecialchars
在将字符串显示给用户之前调用该字符串(但不是在将其放入数据库时).