在我的网站上,我有一个名为 $user_data
的变量,它包含来自表单的输入。然后我在用户页面上显示这个变量(通过回显)。
避免此变量的任何安全风险的最佳方法是什么?我使用 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 注入(inject) 攻击。当您向用户输出变量时,您还需要将 HTML 特殊字符正确替换为 HTML 实体。幸运的是,也有一个函数可以做到这一点:htmlspecialchars() .它将转换特殊的 HTML 字符,例如
<
至<
.这似乎是一个经常被低估的问题,但实际上却很严重。想象一下如果
$user_data
包含<script>SomeNastyScript()</script>
.它可以利用用户浏览器中的现有漏洞,或者它可以向攻击者发送非 HTTPOnly cookie(可能包含已保存的密码),或者它可以诱使用户在通过操作生成的表单上写入密码DOM(可能在 javascript 中),或许多其他不好的东西。这称为XSS(跨站脚本)。
精简版
调用
mysql_real_escape_string
在将字符串插入您的 SQL 查询之前(但不是在您echo
它时)。调用
htmlspecialchars
在将其显示给用户之前在字符串上(而不是在将其放入数据库时)。
关于PHP 安全用户变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3538353/