如何通过PHP清理$ _GET -variables中的数据?
我只对GET
by中的一个变量进行了消毒strip_tags
。我不确定是否应该清理所有内容,因为上次将数据放入Postgres时,使用可以最轻松地解决问题pg_prepare
。
如何通过PHP清理$ _GET -variables中的数据?
您 不 清除$ _GET中的数据。这是PHP脚本中的一种常见方法,但是完全错误*。
所有变量都应保持纯文本格式,直到将其嵌入另一种类型的字符串为止。没有一种转义或“消毒”形式可以覆盖您可能将值嵌入其中的所有可能的字符串类型。
因此,如果要将字符串嵌入到SQL查询中,则需要在退出时对其进行转义:
$sql= "SELECT * FROM accounts WHERE username='".pg_escape_string($_GET['username'])."'";
而且,如果您将字符串拆分为HTML,则需要转义它:
Cannot log in as <?php echo(htmlspecialchars($_GET['username'], ENT_QUOTES)) ?>.
如果您一开始就在$ _GET数组上完成了这两个转义步骤,那么根据不知道自己在做什么的人的建议:
$_GET['username']= htmlspecialchars(pg_escape_string($_GET['username']));
然后,当用户名中包含“&”时,它将神秘地变成“&amp;”
在您的数据库中,并且如果您的用户名中包含单引号,它将在页面上变成两个撇号。然后,当您拥有一个包含这些字符的表单时,在编辑它们时很容易以双转义形式结束它们,这就是为什么这么多不良的PHP
CMS都会以诸如“来自O \\\\ \\\\\\\\\\\\'Reilly”。
自然,每次发送变量时都要记住pg_escape_string或mysql_real_escape_string和htmlspecialchars有点乏味,这就是为什么每个人都希望在脚本开始时在一个位置(不正确)进行操作。对于HTML输出,您至少可以通过定义一个具有回声(htmlspecialchars(…))的短函数来保存一些键入。
对于SQL,最好使用参数化查询。对于Postgres,有pg_query_params。或者确实是您提到的准备好的语句(尽管我个人认为这些语句较难处理)。无论哪种方式,您都可以忘记对SQL进行“清理”或转义,但是如果您嵌入其他类型的字符串(包括HTML),则仍然必须转义。
strip_tags()不是处理HTML显示输入的好方法。过去,它存在安全性问题,因为浏览器解析器在解释标记的含义上实际上比您想象的要复杂得多。htmlspecialchars()几乎始终是正确的选择,因此,如果有人键入小于号,他们实际上会得到一个文字小于号,而不会发现一半文字神秘地消失。
(*:无论如何,这都是解决注入问题的通用方法。自然地,值得在特定字段上进行特定于域的检查,并且可以执行一些有用的清除任务,例如从提交的值中删除所有控制字符。但这是不是大多数PHP编码人员所说的清除含义。)
问题内容: 是否有某个功能全面的功能可以很好地用于清理用户针对SQL注入和XSS攻击的输入,同时仍然允许某些类型的HTML标签? 问题答案: 常见的误解是可以过滤用户输入。PHP甚至有一个(现在已弃用的)“功能”,称为magic-quotes,它基于此思想。废话 忘记过滤(或清洁,或任何人称呼它)。 为避免出现问题,您应该做的事情很简单:每当将字符串嵌入外部代码中时,都必须根据该语言的规则对其进行
问题内容: 我总是使用filter_var($ var,FILTER,FLAG); 当我从$ _GET,$ _ POST等获取数据时,但是现在此数据是JSON字符串,但是我没有找到任何过滤器来净化JSON。有人知道如何实现此过滤器吗? PHP filter_var():http://php.net/manual/en/function.filter- var.php PHP筛选器常量:http :
问题内容: 在对它们提供哈希值并将其存储在数据库中之前,应如何转义或清除用户提供的密码? 当PHP开发人员出于安全目的考虑对用户密码进行哈希处理时,他们通常会像对待其他任何用户提供的数据一样考虑这些密码。这个主题经常出现在与密码存储有关的PHP问题中。开发人员通常希望在散列密码并将其存储在数据库中之前使用诸如(在各种迭代中),和等功能清除密码。 问题答案: 出于多种原因,您永远都不应逃脱,修整或使
我一直在研究清理用户输入的最有效方法。我的应用程序是一个简单的post请求,用于对用户进行身份验证。在网上我可以找到十几种不同的“最佳”方法。这些方法中有很多都使用不推荐的php函数,或者看起来过于复杂。为了连接到我的sql数据库,我使用PDO类。 在搜索自己的函数时,我无意中发现: 带有绑定参数的预准备语句不仅更可移植、更方便、不受SQL注入的影响,而且通常比内插查询执行得快得多,因为服务器端和
问题内容: 我正在尝试将URL作为php中的url参数传递,但是当我尝试获取此参数时我什么也没收到 我正在使用以下网址形式: 我正在努力通过: 但是什么也没回来。问题是什么? 问题答案: 不是函数或语言构造,而只是一个变量(数组)。尝试: 特别是,它是一个超全局变量:一个由PHP填充的内置变量,并且在所有作用域中都可用(您可以在没有global关键字的函数内部使用它)。 由于该变量可能不存在,因此
这一章主要就是讲Quartz,实现的功能就是每隔一段时间就清理没激活邮箱的用户 定制Cron任务加载器 实现一个Job类 自定义Sql的简单应用