PHP 安全用户变量

标签 php sql mysql security

在我的网站上,我有一个名为 $user_data 的变量,它包含来自表单的输入。然后我在用户页面上显示这个变量(通过回显)。

避免此变量的任何安全风险的最佳方法是什么?我使用 strip_tags(),但这还不够。

这个变量也被保存到 MySQL 数据库中。

最佳答案

为了避免严重的安全问题,您必须做两件非常重要的事情。

  1. 在将用户输入放入 SQL 查询之前,您需要对其进行转义。转义就是转义所有的特殊字符,比如' ;幸运的是,已经有一个函数可以自动执行此操作:mysql_real_escape_string .

    如果您不对用户输入进行转义,可能会发生令人讨厌的事情。假设您的查询是 INSERT INTO userdata VALUES ('$user_data') .现在假设用户写了 '; DROP DATABASE userdata; .

    如果你不转义它,你的查询将变成:INSERT INTO userdata VALUES (''; DROP DATABASE userdata;') .正如您想象的那样,这并不好:如果您启用了多语句,您就可以与数据库说再见了。这称为SQL 注入(inject) 攻击。

  2. 当您向用户输出变量时,您还需要将 HTML 特殊字符正确替换为 HTML 实体。幸运的是,也有一个函数可以做到这一点:htmlspecialchars() .它将转换特殊的 HTML 字符,例如 <&lt; .

    这似乎是一个经常被低估的问题,但实际上却很严重。想象一下如果 $user_data包含 <script>SomeNastyScript()</script> .它可以利用用户浏览器中的现有漏洞,或者它可以向攻击者发送非 HTTPOnly cookie(可能包含已保存的密码),或者它可以诱使用户在通过操作生成的表单上写入密码DOM(可能在 javascript 中),或许多其他不好的东西。

    这称为XSS(跨站脚本)。


精简版

  1. 调用mysql_real_escape_string在将字符串插入您的 SQL 查询之前(但不是在您 echo 它时)。

  2. 调用htmlspecialchars在将其显示给用户之前在字符串上(而不是在将其放入数据库时​​)。

关于PHP 安全用户变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3538353/

相关文章:

PHP Lame 流过滤器

PHP 发送电子邮件显示正文内容而不是附件

Mysql生成简单存储函数

mysql - 当两个表没有相同的键时合并数据?

javascript - 如何在 Javascript 数组中存储 MySQL 日期?

php - 从表中选择 *,其中 id = 在 codeigniter 中选择最大 id

sql - 在更新级联时出现意外错误

mysql - #1305 - 函数 [表名].ADD_DATE 不存在

mysql - 无法再看到进程列表

php - 有什么方法可以通过脚本语言 PHP 使用 IP 查找国家名称吗?