PHP安全性真正需要的是什么

时间:2013-09-15 13:29:48

标签: php security

我正在搜索一下,我在PHP中找到了这样的一行;

$mots = mysql_real_escape_string(stripslashes(strip_tags(htmlspecialchars($_POST['mots']))));

我想知道为了尽可能保护$ _POST条目真的有多少必要。

由于

3 个答案:

答案 0 :(得分:0)

真的只需要mysql_real_escape_string, if 你打算以任何方式使用带有sql的$ mots,因为这可以防止SQL注入。

当然这取决于你打算如何使用$ mots。远程文件包含是一种允许人们为服务器执行自己的PHP代码的方法,它基于操纵变量,该变量将强制脚本执行您不想要的操作。这通常发生在包含变量中的代码时,而不是直接包含的内容。

E.g。 include($ mots),而不是include(config.php)。

答案 1 :(得分:0)

你问题的标题可能是一本书的基础。 (它可能已经很多次了)但是如果你试图阻止SQL注入,请将PDO用于准备好的查询(和参数绑定)。这消除了SQL注入的风险。

答案 2 :(得分:0)

清理用户数据

在清理数据时需要什么 - 特别是在这种情况下,用户输入数据 - 取决于多种标准,包括(但不限于)以下内容:

  1. 预期的数据类型(例如stringintegerbinary
  2. 要存储数据的位置(例如databasetext file
  3. 如何使用数据(例如displayed back to usersserver side calculations
  4. 嗯,你得到了要点......
  5. 预期数据类型

    在清理用户输入时,预期的数据类型非常重要,因为它可以使清理变得非常容易或更复杂。

    典型的预期输入类型是:

    1. 文本
    2. 整数
    3. 十进制
    4. 二进制
    5. 如果输入只是integerdecimal,您只需确保输入转换为预期的数据类型即可轻松清理。

      如果预期输入为text,您可能希望转义剥离某些字符/字符串,以防止{{1} }和XSS

      如果输入SQL injection数据,您将需要确保数据是安全的,并且可能希望运行扫描恶意代码并为该文件设置正确的用户权限以防止代码在你的服务器上运行。与binary一样,您可能还需要转义某些字符。

      存储地点

      存储位置也会影响必要的清理。以text vs database为例:

      将数据输入数据库时​​,您需要转义某些字符,以保护您的系统免受尝试file的人的影响,相反,当您不使用数据库时,您不能使用SQL injections,以便专门针对<{1}}不是必需的。

      但是,这并不意味着您可以在不保存到数据库时放松。保存到文件还可能导致上载恶意代码,并且应采取措施防止已上载或创建的文件在服务器上存储SQL信息。 (这并不局限于您特别允许上传文件的代码:

      SQL injection

      它也适用于例如:

      executable

      数据使用

      允许用户输入数据的目的也将在决定您需要应用于用户输入的保护方面发挥作用。虽然可以出于许多不同的原因使用输入,但主要(或最常见)原因可能是:

      1. 要向用户显示(例如<input type="file" name="uploadFile"> file_put_contents($uploaded_data); forum posts
      2. 用于网站计算(例如commentsimages
      3. 如果要将数据显示给用户,您需要考虑保护免受calorie counters等攻击,以及阻止视觉上损害您的网站;这两种方法都可以通过注入标记来执行,例如:insurance quotes

        另一方面,如果数据不会以当前形式显示给用户,那么XSS等可能会有些不相关。

        何时清理/格式化

        在对服务器端执行任何可能受 dodgy 代码影响的任何事情之前(例如在插入数据库之前),应该先处理数据的清理。

        您可以选择在使用数据之前进行清理,您可能希望在启动脚本后立即清理代码。这虽然主要取决于个人偏好和相关系统的使用情况。

        但是,关于何时运行<script>...</script>等功能(即在向用户显示之前上传到数据库 vs 之前)经常存在争议。这再次取决于个人偏好以及您如何使用数据,但这两种方法都有利有弊 - 我不会过多地详细说明。

        但是,如果您将用户数据以XSS(但安全)存储到数据库,则可以随时更改数据清理方式。如果您在使用htmlspecialcharsraw等函数后开始存储数据,那么您正在从输入中删除/更改某些数据,这些数据可能会在以后允许/仅包括意识到你已经丢失了数据。例如:

          默认情况下,

        htmlspecialchars将从输入中删除所有标记   目前看起来是一个好主意,但更进一步,你   可能会决定实际上是否允许某些代码,例如stip_tagsstrip_tags    - 但是已经保存的任何输入中都不再存在它们。

        当然,如果您在保存到数据库之前使用<b><i>(或类似)进行格式化,那么your own mark up等将是完全合理的。同样,如果你只想存储纯文本,那么剥离不平凡的东西也是合理的。同样,这取决于您的用例...


        您的代码

        请参阅注释以了解每个函数的简单解释

        bb

        问题

        您的代码最明显的问题是您应用这些功能的顺序。 strip_tags应该始终来到$mots = mysql_real_escape_string( //Escapes certain characters to 'sanitize' for input to database stripslashes( //Removes any escape slashes added by default in $_POST strip_tags( //Removes any tags present in the text e.g. <b></b> htmlspecialchars( //Coverts some charachters like £ to html codes like &pound; $_POST['mots'] ) ) ) ); 之前(或任何其他将编码字符的函数)。原因很简单:

        stip_tags

        在上面的代码示例中,您可以看到,如果您在htmlspecialchars之前运行$_POST['userinput'] = "<b>Some user input</b>"; //Input uploaded from form echo strip_tags($_POST['userinput']); //Ouputs: Some user input echo htmlspecialchars($_POST['userinput'], ENT_QUOTES, 'UTF-8'); //Output: &lt;b&gt;Some user input&lt;/b&gt; echo strip_tags(htmlspecialchars()); //Output: &lt;b&gt;Some user input&lt;/b&gt; ,则htmlspecialcharsstrip_tags符号将转换为各自的<和没有剥离......基本上,>是无用的。但是,如果您先运行它,那么您将根据需要剥离标记,并编码任何其他杂项html codes