Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
清理PHP/SQL$\u POST、$\u GET等。。。?_Php_Mysql Real Escape String_Html Entities_Htmlspecialchars - Fatal编程技术网

清理PHP/SQL$\u POST、$\u GET等。。。?

清理PHP/SQL$\u POST、$\u GET等。。。?,php,mysql-real-escape-string,html-entities,htmlspecialchars,Php,Mysql Real Escape String,Html Entities,Htmlspecialchars,好的,这个主题是一个温床,我明白。我也理解这种情况取决于您使用的代码。我有三种情况需要解决 我有一个表单,我们需要允许人们使用逗号、波浪号等进行评论和陈述。。。但仍能免受攻击 我有人输入这样的日期:10/13/11 mm/dd/yy(英文),这可以消毒吗 我如何理解如何正确使用htmlspecialchars()、htmlentities()和real\u escape\u string()?我读过php.net网站和这里的一些帖子,但在我看来,这完全取决于阅读问题的人正确答案是什么 我真的不能

好的,这个主题是一个温床,我明白。我也理解这种情况取决于您使用的代码。我有三种情况需要解决

  • 我有一个表单,我们需要允许人们使用逗号、波浪号等进行评论和陈述。。。但仍能免受攻击

  • 我有人输入这样的日期:10/13/11 mm/dd/yy(英文),这可以消毒吗

  • 我如何理解如何正确使用
    htmlspecialchars()
    htmlentities()
    real\u escape\u string()
    ?我读过php.net网站和这里的一些帖子,但在我看来,这完全取决于阅读问题的人正确答案是什么

  • 我真的不能接受。。。必须有一个答案,其中的文本格式类似于我在这里张贴可以消毒。我想知道这是否可能以及如何可能

    谢谢。。。因为在我看来,当在其他地方问这个问题时,它往往会激怒。。。我正在学习我需要知道的东西,但我想我已经在我所能知道的东西上达到了一个平台,没有一个例子说明它的意义


    提前谢谢

    关键是要了解每个可用的消毒功能是什么,以及何时使用。例如,数据库转义函数旨在使数据安全地插入到数据库中,因此应该使用数据库转义函数;但HTML转义函数的设计目的是消除恶意HTML代码(如JavaScripts),并确保安全地输出数据供用户查看。在正确的时间对正确的事情进行消毒*

    • 您可以采取两种不同的基本方法:在接收HTML时对其进行清理,或者在接收HTML时将其完全存储,并仅在将其输出给用户时对其进行清理。每种方法都有其支持者,但第二种方法可能是最不容易出现问题的方法(对于第一种方法,如果在清理过程中发现缺陷,并且发现数据库中存储的内容没有经过充分清理,您该怎么办?)

    可以使用日期解析功能对日期进行清理。在PHP中,您可能会看到。您的目标通常是获取日期的字符串表示形式,并以规范的方式(即:以特定格式)输出表示日期的对象或另一个表示相同日期的字符串。

    这是一个非常重要的问题,它实际上以编码的形式给出了一个简单的答案。你面临的问题是,你同时使用多种语言。首先是HTML,然后是PHP,几秒钟后是SQL。所有这些语言都有自己的语法规则

    要记住的一点是:字符串应该始终采用正确的编码

    让我们举个例子。您有一个HTML表单,用户在其中输入以下字符串:


    我真的关于日期的清理,PHP有一些内置函数可以帮助您。strotime()函数将几乎任何可以想象的日期/时间格式转换为Unix时间戳,然后可以将其传递给date()函数,以将其转换为您喜欢的任何格式

    例如:


    $date_sql=date(“Y-m-d”,strotime($_POST[“date”])

    好的。。。我希望插入一个语句,允许像我现在所做的语句这样的字符。仅此而已,然后允许查看此语句。因此您有两个脚本:一个接收内容(消息)并将其插入数据库,另一个检索内容并显示它。第一个脚本将数据发送到数据库,因此它需要使用数据库转义函数,以确保以这种方式使用数据的安全性。第二个脚本将数据发送到用户的浏览器,因此它需要使用HTML转义函数来消除浏览器处理该数据可能对用户造成伤害的可能方式。然而,HTML逃逸并不是唯一要考虑的事情;查找跨站点请求伪造。我在一个页面中完成此操作,而不是在多个页面中完成,如果我了解您所说的内容。。。不过我不想这么说,我已经看过你的建议了。如果我一开始不明白如何正确地回答最初的问题,我真的不需要其他方法来做一些事情。令人惊讶的是,你最终花了多少时间在web应用程序中的字符串卫生上。我敢说,我编写的绝大多数PHP代码都是纯字符串操作。与之相比,实际的“逻辑”部分相形见绌。+1用于说明为什么在插入数据库之前进行HTML编码是一个坏主意。您能介绍一下您所谈论的概念吗?还有,只是好奇。。。有没有办法拆下&;额外服务?如果您最终得到
    &
    extras,可能是字符串已经用
    htmlspecialchars
    编码了两次。您可以使用
    htmlspecialchars\u decode
    来去除它们。但是做这件事时要非常小心!这可能会使字符串再次受到javascript注入攻击。找到错误地应用第二个
    htmlspecialchars
    @Rodin的地方几乎总是更好的。谢谢,你是第一个真正将这一点应用到每个代码实际功能示例中的人。非常感谢。这有助于理解如何正确使用这些工具。我相信很多其他人也会欣赏你的努力。@Rodin我有一个问题,你使用print,它与echo correct做相同的事情?但是这能防止注入吗?这真的与注入无关,因为它发生在PHP级别。如果您希望防止注入,我建议使用php_mysqli扩展中支持的预置语句
    <form action="post.php" method="get">
        <textarea name="comment">
            I really <3 dogs &amp; cats ;')
        </textarea>
        <input type="submit"/>
    </form>
    
    http://www.example.org/form.php?comment=I%20really%20%3C3%20dogs%20&amp;%20cats%20;')
    
    // Connect to database, etc....
    
    // Place the new comment in the database
    $comment = $_GET['comment']; // Comment is encoded as PHP string
    
    // Using $comment in a SQL query, need to encode the string to SQL first!
    $query = "INSERT INTO posts SET comment='". mysql_real_escape_string($comment) ."'";
    mysql_query($query);
    
    // Get list of comments from the database
    $query = "SELECT comment FROM posts";
    
    print '<html><body><h2>Posts</h2>';
    print '<table>';
    
    while($post = mysql_fetch_assoc($query)) {
        // Going from PHP string to HTML, need to encode!
        print '<tr><td>'. htmlspecialchars($post['comment']) .'</td></tr>';
    }
    
    print '</table>';
    print '</body></html>'