在 PHP 中对用户输入使用正则表达式
Using Regular Expressions with user input in PHP
我想知道是否有人知道如何解决这个问题。
我正在从 HTML 表单收集用户输入,然后使用 htmlspecialchars
将其发布到 PHP 以避免在使用 quotes/etc...[=16 时出现问题=]
不过,我还想 运行 对通过正则表达式收集的数据进行服务器端验证检查 - 尽管我不确定该怎么做。
到目前为止,我已经考虑过对 htmlspecialchars 进行解码 - 但因为我将立即使用字符串,这意味着代码可能会在我 运行 这种转换之后中断。例如:假设用户在字段中输入了单引号 "
。这将被转换为 "
,然后如果我解码它并在变量中使用它,它最终可能会像:$string = "
"";
这会给我带来问题.
如有任何建议,我们将不胜感激!
我假设 htmlspecialchars()
函数在 将表单发布到 PHP 之后被调用 。最简单的解决方案是首先匹配正则表达式,然后执行 htmlspecialchars()
.
此外,如果您使用 htmlspecialchars()
编码的字符串,在使用 htmlspecialchars_decode()
解码后,PHP 内部表示将是 "\""
,因此您不会破坏任何内容。将字符串手动写入 PHP 文件的方式与 PHP 内部处理它们的方式有很大的不同。你真的不需要被这个打扰。
您似乎误解了数据之间的区别以及这些数据如何更改为在特定上下文中可解析。
一个php字符串可以包含任何数据。此字符串中存储的是 "raw" 形式:如果需要,我们希望以这种形式操作数据。
在某些情况下,并非所有字符都有效。例如,在 html 文本区域中,不能使用 <
和 >
字符,因为它们是特殊字符。我们仍然希望能够使用这些字符。要在上下文中使用特殊字符,我们 转义 这些字符。通过转义一个特殊字符,它失去了它的特殊含义。在 html 文本区域的上下文中,<
字符被转义为序列 <
。与 <
字符不同,这个转义序列在 html 中没有特殊含义,因此如果我们将以下序列发送到浏览器,它知道如何解析该序列并显示正确的内容: <textarea><</textarea>
。当我们说这个textarea包含的数据是什么的时候,我们不是说它包含<
,而是说它包含<
.
如您所说,在 php 脚本中,在双引号字符串中, "
字符具有特殊含义。这 仅 与 解析 有关。 PHP 根本不知道如何解析序列 $str = """;
。如果我们想在这样的双引号字符串中使用双引号,我们需要将其转义。我们通过在 \
前面加上 php 双引号字符串来转义双引号。要创建包含单个双引号的字符串,使用双引号表示法,您可以编写 $str = "\"";
.
但是,none 这很重要。。您正在从 html 表单中获取输入。当您单击提交按钮时,浏览器读取文本区域中的内容(并将其解码为 html?)。然后浏览器按照表单标签规定的方式对其进行编码,并将其发送到服务器。然后服务器将文本块解码为原始数据形式。该数据被传递给 PHP,您将在 $_POST['myTextarea']
.
中遇到这种形式
结论:如果数据已编码,请了解它是针对哪个上下文编码的,并根据该上下文对其进行解码。您不需要转义 php 带引号的字符串,因为您正在处理内部字符串。没有什么可解析的。提醒自己,当您打算在某处使用数据时,您应该注意对特定上下文的数据中的所有特殊字符进行转义。
我想知道是否有人知道如何解决这个问题。
我正在从 HTML 表单收集用户输入,然后使用 htmlspecialchars
将其发布到 PHP 以避免在使用 quotes/etc...[=16 时出现问题=]
不过,我还想 运行 对通过正则表达式收集的数据进行服务器端验证检查 - 尽管我不确定该怎么做。
到目前为止,我已经考虑过对 htmlspecialchars 进行解码 - 但因为我将立即使用字符串,这意味着代码可能会在我 运行 这种转换之后中断。例如:假设用户在字段中输入了单引号 "
。这将被转换为 "
,然后如果我解码它并在变量中使用它,它最终可能会像:$string = "
"";
这会给我带来问题.
如有任何建议,我们将不胜感激!
我假设 htmlspecialchars()
函数在 将表单发布到 PHP 之后被调用 。最简单的解决方案是首先匹配正则表达式,然后执行 htmlspecialchars()
.
此外,如果您使用 htmlspecialchars()
编码的字符串,在使用 htmlspecialchars_decode()
解码后,PHP 内部表示将是 "\""
,因此您不会破坏任何内容。将字符串手动写入 PHP 文件的方式与 PHP 内部处理它们的方式有很大的不同。你真的不需要被这个打扰。
您似乎误解了数据之间的区别以及这些数据如何更改为在特定上下文中可解析。
一个php字符串可以包含任何数据。此字符串中存储的是 "raw" 形式:如果需要,我们希望以这种形式操作数据。
在某些情况下,并非所有字符都有效。例如,在 html 文本区域中,不能使用 <
和 >
字符,因为它们是特殊字符。我们仍然希望能够使用这些字符。要在上下文中使用特殊字符,我们 转义 这些字符。通过转义一个特殊字符,它失去了它的特殊含义。在 html 文本区域的上下文中,<
字符被转义为序列 <
。与 <
字符不同,这个转义序列在 html 中没有特殊含义,因此如果我们将以下序列发送到浏览器,它知道如何解析该序列并显示正确的内容: <textarea><</textarea>
。当我们说这个textarea包含的数据是什么的时候,我们不是说它包含<
,而是说它包含<
.
如您所说,在 php 脚本中,在双引号字符串中, "
字符具有特殊含义。这 仅 与 解析 有关。 PHP 根本不知道如何解析序列 $str = """;
。如果我们想在这样的双引号字符串中使用双引号,我们需要将其转义。我们通过在 \
前面加上 php 双引号字符串来转义双引号。要创建包含单个双引号的字符串,使用双引号表示法,您可以编写 $str = "\"";
.
但是,none 这很重要。。您正在从 html 表单中获取输入。当您单击提交按钮时,浏览器读取文本区域中的内容(并将其解码为 html?)。然后浏览器按照表单标签规定的方式对其进行编码,并将其发送到服务器。然后服务器将文本块解码为原始数据形式。该数据被传递给 PHP,您将在 $_POST['myTextarea']
.
结论:如果数据已编码,请了解它是针对哪个上下文编码的,并根据该上下文对其进行解码。您不需要转义 php 带引号的字符串,因为您正在处理内部字符串。没有什么可解析的。提醒自己,当您打算在某处使用数据时,您应该注意对特定上下文的数据中的所有特殊字符进行转义。