Léo*_* 준영 30 php sanitization get
你如何通过PHP清理$ _GET -variables中的数据?
我在GET中只消除了一个变量strip_tags
.我不确定是否应该清理所有内容,因为上次将数据放入Postgres时,问题最容易通过使用来解决pg_prepare
.
bob*_*nce 78
你如何通过PHP清理$ _GET -variables中的数据?
您没有清理$ _GET中的数据.这是PHP脚本中的常见方法,但它完全错误*.
所有变量都应保持纯文本格式,直到将它们嵌入另一种类型的字符串中.没有任何形式的转义或"清理"可以涵盖您可能将您的值嵌入的所有可能类型的字符串.
因此,如果您将字符串嵌入到SQL查询中,则需要在出路时将其转义:
$sql= "SELECT * FROM accounts WHERE username='".pg_escape_string($_GET['username'])."'";
Run Code Online (Sandbox Code Playgroud)
如果你将字符串吐出到HTML中,则需要将其转义:
Cannot log in as <?php echo(htmlspecialchars($_GET['username'], ENT_QUOTES)) ?>.
Run Code Online (Sandbox Code Playgroud)
如果您在开始时在$ _GET数组上执行了这两个转义步骤,那么根据不知道他们正在做什么的人的建议:
$_GET['username']= htmlspecialchars(pg_escape_string($_GET['username']));
Run Code Online (Sandbox Code Playgroud)
然后当你的用户名中有'&'时,它会神秘地变成'&' 在您的数据库中,如果您的用户名中有撇号,它将在页面上变成两个撇号.然后当你有一个包含这些字符的表单时,很容易在编辑时结束双重转义,这就是为什么这么多糟糕的PHP CMS最终会出现像"来自O \\\\的新书"这样的文章. \\\\\\\\\\\\\\\"赖利".
当然,每次发送变量时记住pg_escape_string或mysql_real_escape_string和htmlspecialchars都有点乏味,这就是为什么每个人都希望在脚本开头的某个地方(错误地)这样做.对于HTML输出,您至少可以通过定义一个具有echo(htmlspecialchars(...))的短名称的函数来保存一些类型.
对于SQL,最好使用参数化查询.对于Postgres,有pg_query_params.或者实际上,正如你所提到的那样准备好的陈述(虽然我个人认为它们不易被管理).无论哪种方式,您都可以忘记对SQL进行"清理"或转义,但如果嵌入其他类型的字符串(包括HTML),则仍必须转义.
strip_tags()不是处理HTML显示输入的好方法.在过去,它存在安全问题,因为浏览器解析器实际上对标记的解释要比您想象的要复杂得多.htmlspecialchars()几乎总是使用正确的东西,所以如果有人输入一个小于号的符号,他们实际上会得到一个文字小于号,而不是找到一半的文字神秘地消失.
(*:作为解决注入问题的一般方法,无论如何.当然,特定领域的检查值得在特定字段上进行,并且您可以执行有用的清理任务,例如从提交的值中删除所有控制字符.但这是而不是大多数PHP程序员通过清理来表示的意思.)
如果您正在讨论清理输出,我建议您在数据库中以完整的,未转义的形式存储内容,然后在回显数据时转义它(htmlspecialchars或其他东西),这样您就有了更多的输出选项.有关清理/转义数据库内容的讨论,请参阅此问题.
就在postgres中存储而言,在查询中的每个变量上使用pg_escape_string来转义引号,并且通常防止SQL注入.
编辑:
我在数据库中存储数据然后检索它的常用步骤是:
调用数据库数据转义函数(pg_escape_string,mysql_escape_string等),以转义查询中使用的每个传入的$ _GET变量.请注意,使用这些函数而不是addslashes会导致在存储在数据库中时文本中没有额外的斜杠.
当你从数据库中取回数据时,你可以在任何输出数据上使用htmlspecialchars,不需要使用stripslashes,因为不应该有额外的斜杠.