1

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

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

我想知道要尽可能好地保护 $_POST 条目,其中有多少是真正必要的。

谢谢

4

3 回答 3

0

如果您打算以任何方式将 $mots 与 sql 一起使用,那么实际上只需要 mysql_real_escape_string ,因为这可以防止 SQL 注入。

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

例如 include($mots),而不是 include(config.php)。

于 2013-09-15T13:34:51.893 回答
0

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

于 2013-09-15T13:38:22.913 回答
0

清理用户数据

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

  1. 预期的数据类型(例如string, integer, binary
  2. 数据的存储位置(例如database, text file
  3. 如何使用数据(例如displayed back to usersserver side calculations
  4. 嗯,你明白了要点...

预期数据类型

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

典型的预期输入类型是:

  1. 文本
  2. 整数
  3. 十进制
  4. 二进制

如果输入只是一个integerdecimal数字,您只需确保将输入转换为预期的数据类型即可轻松清理。

如果出现text预期输入,您可能希望转义删除某些字符/字符串以防止出现 和之类的XSS东西SQL injection

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

存储位置

存储位置也会影响需要进行哪些消毒。以databasevs为例file

将数据输入数据库时​​,您需要转义某些字符以保护您的系统免受其他人的攻击SQL injections,当不使用您不使用的数据库时,不需要SQL专门针对这些字符进行保护SQL injection

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

<input type="file" name="uploadFile">

它也适用于例如:

file_put_contents($uploaded_data);

数据使用

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

  1. 显示给用户(例如forum posts, comments, images
  2. 用于现场计算(例如calorie counters, insurance quotes

如果要将数据显示给用户,您需要考虑保护免受攻击XSS,以及停止在视觉上破坏您的网站;这两者都可以通过注入标签来执行,例如:<script>...</script>

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

何时清理/格式化

在您对可能受狡猾代码影响的服务器端进行任何操作之前(例如,在插入数据库之前),应先对数据进行清理。

您可能会选择在使用数据之前进行清理,或者您可能更喜欢在启动脚本后立即清理代码。这在很大程度上取决于个人偏好和相关系统的用例。

然而,关于何时运行类似的函数经常存在争论htmlspecialchars(即在上传到数据库之前在向用户显示之前)。这再次取决于个人喜好以及您如何使用数据,但是这两种方法都有优缺点 - 我不会详细说明。

但是,如果您将用户数据以raw(但安全)的方式存储到数据库中,那么您可以随意更改随时间清理数据的方式。就好像您在使用诸如此类的功能后开始存储数据一样htmlspecialcharsstip_tags您正在从输入中删除/更改一些数据,您可能会在以后决定允许/包含这些数据,只是为了意识到您已经丢失了数据。例如:

strip_tags默认情况下,会从输入中删除所有标签,这在目前看来是个好主意,但更进一步,您可能会决定实际上想要允许一些标签,例如<b><i> - 但它们不再存在于已经存在的任何输入中被保存。

当然,如果您使用your own mark upor bb(或类似的)进行格式化,那么strip_tags在保存到数据库之前 etc 将是完全合理的。同样,如果您只想存储纯文本,那么剥离所有非纯文本也是合理的。同样,这取决于您的用例...


你的代码

有关每个函数的作用的简单说明,请参见注释。

$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;

在上面的代码示例中,您可以看到,如果您在 and 符号转换为各自的符号之前运行并且没有被htmlspecialchars剥离......所以本质上是没用的。但是,如果您首先运行它,那么您将根据需要剥离标签并编码任何其他 miscellaneous 。strip_tags<>html codesstrip_tagsspecial chars

于 2013-09-15T15:14:30.723 回答