【问题标题】:how to clean POST and GET vars in PHP for XSS and SQL injection如何清理 PHP 中的 POST 和 GET 变量以进行 XSS 和 SQL 注入
【发布时间】:2013-02-18 14:57:06
【问题描述】:

在我的网络应用程序中有一个配置文件,其中包括数据库连接设置,并且始终在 PHP 脚本的第一行加载。我想包含一个函数,它可以清除所有 POST 和 GET 数据,以应对可能存在的 XSS 和 SQL 注入风险。

我不确定这个功能是否真的足够

function make_safe($variable) 
{
   $variable = strip_tags(mysql_real_escape_string(trim($variable)));
   return $variable; 
}

foreach ($_POST as $key => $value) {
   $_POST[$key] = make_safe($value);
}
//Same for $_GET & $_SESSION

你对这个问题有什么建议吗?

【问题讨论】:

  • 这里有两个不同的问题。一次只专注于它们。将数据插入 SQL 时处理 SQL 注入。向 HTML 中插入数据时处理 XSS。
  • How to prevent SQL injection in PHP? 与您遇到的 first 问题(SQL 注入)重复。 XSS 是你的第二个问题。也有很多答案可以解释如何防御这种情况,请四处寻找。
  • 如果您使用上述功能,那么您可以在您的应用程序中使用编辑器吗?

标签: php http-post xss http-get


【解决方案1】:

这个函数:

function make_safe($variable) 
{
   $variable = strip_tags(mysql_real_escape_string(trim($variable)));
   return $variable; 
}

不会工作

SQL 注入和 XSS 是两种不同的野兽。因为它们每个都需要不同的转义,所以您需要分别使用每个转义函数 strip_tags 和 mysql_real_escape_string。 加入他们将破坏每个人的安全性。

将数据输入数据库时​​使用标准的mysql_real_escape_string()。 使用 strip_tags() 从数据库中查询内容,然后将它们输出到屏幕。

为什么结合这两个功能是危险的 来自马口:http://php.net/manual/en/function.strip-tags.php

因为strip_tags() 并不实际验证 HTML,部分或损坏的标签可能会导致删除比预期更多的文本/数据。

因此,通过将格式错误的 html 输入数据库字段,聪明的攻击者可以使用您的幼稚实现来击败组合中的 mysql_real_escape_string()

【讨论】:

  • 不要使用 mysql_real_escape_string。完全停止使用过时的 mysql 扩展并使用 PDO 或 mysqli。
猜你喜欢
  • 2015-04-17
  • 2010-10-02
  • 2013-05-20
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 2017-01-10
相关资源
最近更新 更多