我正在搜索一下,我在PHP中找到了这样的一行;
$mots = mysql_real_escape_string(stripslashes(strip_tags(htmlspecialchars($_POST['mots']))));
我想知道为了尽可能保护$ _POST条目真的有多少必要。
由于
答案 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)
在清理数据时需要什么 - 特别是在这种情况下,用户输入数据 - 取决于多种标准,包括(但不限于)以下内容:
string
,integer
,binary
)database
,text file
)displayed back to users
,server side calculations
)在清理用户输入时,预期的数据类型非常重要,因为它可以使清理变得非常容易或更复杂。
典型的预期输入类型是:
如果输入只是integer
或decimal
,您只需确保输入转换为预期的数据类型即可轻松清理。
如果预期输入为text
,您可能希望转义或剥离某些字符/字符串,以防止{{1} }和XSS
。
如果输入SQL injection
数据,您将需要确保数据是安全的,并且可能希望运行扫描恶意代码并为该文件设置正确的用户权限以防止代码在你的服务器上运行。与binary
一样,您可能还需要转义某些字符。
存储位置也会影响必要的清理。以text
vs database
为例:
将数据输入数据库时,您需要转义某些字符,以保护您的系统免受尝试file
的人的影响,相反,当您不使用数据库时,您不能使用SQL injections
,以便专门针对<{1}}不是必需的。
但是,这并不意味着您可以在不保存到数据库时放松。保存到文件还可能导致上载恶意代码,并且应采取措施防止已上载或创建的文件在服务器上存储SQL
信息。 (这并不局限于您特别允许上传文件的代码:
SQL injection
它也适用于例如:
executable
允许用户输入数据的目的也将在决定您需要应用于用户输入的保护方面发挥作用。虽然可以出于许多不同的原因使用输入,但主要(或最常见)原因可能是:
<input type="file" name="uploadFile">
,file_put_contents($uploaded_data);
,forum posts
)comments
,images
)如果要将数据显示给用户,您需要考虑保护免受calorie counters
等攻击,以及阻止视觉上损害您的网站;这两种方法都可以通过注入标记来执行,例如:insurance quotes
另一方面,如果数据不会以当前形式显示给用户,那么XSS
等可能会有些不相关。
在对服务器端执行任何可能受 dodgy 代码影响的任何事情之前(例如在插入数据库之前),应该先处理数据的清理。
您可以选择在使用数据或之前进行清理,您可能希望在启动脚本后立即清理代码。这虽然主要取决于个人偏好和相关系统的使用情况。
但是,关于何时运行<script>...</script>
等功能(即在向用户显示之前上传到数据库 vs 之前)经常存在争议。这再次取决于个人偏好以及您如何使用数据,但这两种方法都有利有弊 - 我不会过多地详细说明。
但是,如果您将用户数据以XSS
(但安全)存储到数据库,则可以随时更改数据清理方式。如果您在使用htmlspecialchars
和raw
等函数后开始存储数据,那么您正在从输入中删除/更改某些数据,这些数据可能会在以后允许/仅包括意识到你已经丢失了数据。例如:
默认情况下,
htmlspecialchars
将从输入中删除所有标记 目前看起来是一个好主意,但更进一步,你 可能会决定实际上是否允许某些代码,例如stip_tags
或strip_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 £
$_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: <b>Some user input</b>
echo strip_tags(htmlspecialchars());
//Output: <b>Some user input</b>
,则htmlspecialchars
和strip_tags
符号将转换为各自的<
和没有剥离......基本上,>
是无用的。但是,如果您先运行它,那么您将根据需要剥离标记,并编码任何其他杂项html codes
。