我应该在GET和POST请求中转义字符吗?


Should I escape characters in my GET and POST requests?

我刚刚读到PHP在一段时间内自己转义传入的GET和POST请求。双重逃避没有好处。我应该转义字符串吗?

例如,我处理这样一个简单的输入:
$contact = mysqli_real_escape_string($dbLink, strip_tags($_POST['contact']));

之后,当保存并从数据库检索时,我用最后的值填充输入,如:

echo '<input type="text" class="form-control" id="inputContact" name="contact" value="'.$contact.'">'.PHP_EOL;

当有人在字段中输入引号时,它返回如下内容,这会破坏表单:

<input type="text" class="form-control" id="inputContact" name="contact" value="0900 123 456, jozefmat" ejkasdfadsf"="">

我刚刚读到PHP在一段时间内自己转义传入的GET和POST请求

这是魔术引号,它们总是无效的,更多的麻烦比他们值得。它们已被弃用,PHP的现代版本根本不支持它们。

应该转义字符串吗?

是的。您应该对不受信任的数据执行适当的处理(通过转义、白名单过滤或其他一些合适的方法),这适用于您放置数据的地方(这取决于您是否将其插入数据库查询(搜索SQL注入)、HTML文档(搜索XSS跨站点脚本)或其他地方)。

正如你所注意到的,即使在HTML文档中,你也可以使用不同的选项——适合"元素内部"的选项并不总是适合"属性值内部"或"脚本元素内部"的选项。

这实际上取决于您使用响应的目的以及之后是否对它们进行了操作。

例如,如果您正在将数据插入到DB中,那么您应该转义您的数据以防止SQL注入。如果您只是显示数据,那么应该没有必要,除非您显示特定的字符。但是你也可以把它们换成HTML实体

在你给出的例子中

,你应该转义它们,因为这就是SQL注入的工作方式

看情况。如果你检索或发送任何东西到数据库,那么是的,你应该转义字符,以避免mysql注入。但如果只是处理客户端(浏览器)方面的问题,那就没什么大不了的了