Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:关于如何使用用户输入的建议;免疫的;_Php_User Input_Sanitize - Fatal编程技术网

PHP:关于如何使用用户输入的建议;免疫的;

PHP:关于如何使用用户输入的建议;免疫的;,php,user-input,sanitize,Php,User Input,Sanitize,我通常通过执行以下操作来逃避用户输入: $data = $_POST['raw data']; //Shorthand used; you all know what a query looks like. mysql_query("INSERT " . mysql_real_escape_string($data)); $show = mysql_query("SELECT ..."); echo htmlentities($show); // Note that htmlentities(

我通常通过执行以下操作来逃避用户输入:

$data = $_POST['raw data'];
//Shorthand used; you all know what a query looks like.
mysql_query("INSERT " . mysql_real_escape_string($data));

$show = mysql_query("SELECT ...");
echo htmlentities($show);
// Note that htmlentities() is usually overzealous.
// htmlspecialchars() is enough the majority of the time.
// You also don't have to use ENT_QUOTES unless you are using single
// quotes to delimit input (or someone please correct me on this).
htmlspecialchars($str,entu引号,“UTF-8”)

无论何时mysql连接可用,都可以使用
mysql\u real\u escape\u string($str)

如何改进这一点?到目前为止,我还没有遇到任何问题,但我不确定


谢谢。

如果您只使用
mysql\u real\u escape\u string($str)
来避免sql注入,请确保在查询中始终在其周围添加单引号


当解析屏幕上不安全的输出时,htmlspecialchars很好。

如果您只使用
mysql\u real\u escape\u string($str)
来避免sql注入,请确保始终在查询中在其周围添加单引号


当解析屏幕上的不安全输出时,htmlspecialchars可以正常工作。

用于数据库切换到PDO。 这会更容易,而且会帮你逃走


用于数据库切换到PDO。 这会更容易,而且会帮你逃走

数据应转义(消毒)以供存储,并进行编码以供显示。数据永远不应该被编码存储。您只想存储原始数据。注意转义根本不会改变原始数据,因为转义字符不会被存储;它们仅用于正确表示原始数据和命令语法之间的差异

简而言之,您要执行以下操作:

$data = $_POST['raw data'];
//Shorthand used; you all know what a query looks like.
mysql_query("INSERT " . mysql_real_escape_string($data));

$show = mysql_query("SELECT ...");
echo htmlentities($show);
// Note that htmlentities() is usually overzealous.
// htmlspecialchars() is enough the majority of the time.
// You also don't have to use ENT_QUOTES unless you are using single
// quotes to delimit input (or someone please correct me on this).
如果启用了magic quotes,您可能还需要从用户输入中删除斜杠<代码>条带斜杠()
就足够了

至于为什么不应为存储编码,请举以下示例:

假设您有一个DB字段是
char(5)
。html输入也是
maxlength=“5”
。如果用户输入了可能完全有效的“&&&&&&”,则在检索并显示给用户时,会将其存储为“&&.”,如果不进行编码,他们将看到不正确的“&&.”。如果您进行编码,他们会看到“&;&”,这也是不正确的。您没有存储用户打算存储的数据。您需要存储原始数据

在用户希望存储特殊字符的情况下,这也成为一个问题。你如何处理这些物品的储存?你没有。生吃

为了防止sql注入,至少要使用
mysql\u real\u escape\u string
进行escape输入,但建议使用准备好的语句和类似PDO的DB包装器。找出哪一个工作得最好,或者编写自己的(并彻底测试)

为了防御XSS(跨站点脚本),请在用户输入显示回之前对其进行编码。

数据应转义(消毒)以供存储,并编码以供显示。数据永远不应该被编码存储。您只想存储原始数据。注意转义根本不会改变原始数据,因为转义字符不会被存储;它们仅用于正确表示原始数据和命令语法之间的差异

简而言之,您要执行以下操作:

$data = $_POST['raw data'];
//Shorthand used; you all know what a query looks like.
mysql_query("INSERT " . mysql_real_escape_string($data));

$show = mysql_query("SELECT ...");
echo htmlentities($show);
// Note that htmlentities() is usually overzealous.
// htmlspecialchars() is enough the majority of the time.
// You also don't have to use ENT_QUOTES unless you are using single
// quotes to delimit input (or someone please correct me on this).
如果启用了magic quotes,您可能还需要从用户输入中删除斜杠<代码>条带斜杠()就足够了

至于为什么不应为存储编码,请举以下示例:

假设您有一个DB字段是
char(5)
。html输入也是
maxlength=“5”
。如果用户输入了可能完全有效的“&&&&&&”,则在检索并显示给用户时,会将其存储为“&&.”,如果不进行编码,他们将看到不正确的“&&.”。如果您进行编码,他们会看到“&;&”,这也是不正确的。您没有存储用户打算存储的数据。您需要存储原始数据

在用户希望存储特殊字符的情况下,这也成为一个问题。你如何处理这些物品的储存?你没有。生吃

为了防止sql注入,至少要使用
mysql\u real\u escape\u string
进行escape输入,但建议使用准备好的语句和类似PDO的DB包装器。找出哪一个工作得最好,或者编写自己的(并彻底测试)


为了防御XSS(跨站点脚本),请在用户输入显示回用户之前对其进行编码。

只有在使用用户输入时,才需要转义用户输入,然后才需要使用确切使用所需的卫生方法。相关或欺骗:我会读一读。谢谢。用户输入只有在使用时才需要转义,然后才需要使用确切使用所需的卫生方法。相关或欺骗:我会读一读。非常感谢。