Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.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_Validation - Fatal编程技术网

PHP安全地接收用户输入

PHP安全地接收用户输入,php,validation,Php,Validation,我想善待我的用户,但不想错误地获取恶意代码。 看了这么多的问题,我决定加入白名单,所以我只得到我认可的角色 如何才能善待用户,让他们输入许多字符,同时仍能保护我的输入免受恶意代码的攻击? 我将Apache与PHP5.3.8结合使用,我还没有加入PDO,因为当我听说它时,我已经深入到项目中,担心它可能会有太大的变化 任何想法都会有帮助 如果可以输出给用户,则必须防止潜在的恶意用户在其代码中包含HTML标记。例如,如果在那篇文章中,我可能会包含一个脚本标记,这对任何阅读我文章的用户来说都是非常危险的

我想善待我的用户,但不想错误地获取恶意代码。 看了这么多的问题,我决定加入白名单,所以我只得到我认可的角色

如何才能善待用户,让他们输入许多字符,同时仍能保护我的输入免受恶意代码的攻击?
我将Apache与PHP5.3.8结合使用,我还没有加入PDO,因为当我听说它时,我已经深入到项目中,担心它可能会有太大的变化


任何想法都会有帮助

如果可以输出给用户,则必须防止潜在的恶意用户在其代码中包含HTML标记。例如,如果在那篇文章中,我可能会包含一个
脚本
标记,这对任何阅读我文章的用户来说都是非常危险的。要防止出现这种情况,请使用:

这样,我的
标记将被翻译为
脚本
,这样在浏览器中显示时不会对用户造成伤害

现在,如果您想在数据库中保存我的帖子,您必须小心SQL注入。假设您正在使用该查询保存我的帖子(是的,您不应该使用
mysql.*
函数,因为它们已被弃用,但这只是为了解释这个想法):

听起来不错?好吧,如果我很讨厌,我会尽量把那个帖子包括进去:

test'); DELETE FROM posts; SELECT * FROM posts WHERE data = '
你的MySQL得到的是

INSERT INTO posts(data) values('test'); DELETE FROM posts; SELECT * FROM posts WHERE data = '');
哎哟。因此,您必须基本上防止您的用户在其帖子中包含引号和双引号,或者更准确地说,您应该避开它们。这实际上取决于您使用的库,但在我使用的过时库中,这将被写入:

$really_clean_data = mysql_real_escape_string($db, $clean_data);
mysql_query($db, "INSERT INTO posts(data) values('$really_clean_data');");
因此,通过上面的恶意帖子,MySQL现在将收到

INSERT INTO posts(data) values('test\'); DELETE FROM posts; SELECT * FROM posts WHERE data = \'');
现在,对于MySQL,整个
插入POST(数据)值('test');删除职位;从数据为“”的帖子中选择*部分是一个正确的字符串,所以发生的事情就是您想要发生的事情


基本上,在几乎所有的情况下,这就是你所需要的。请记住,当您将用户数据提供给解释器(它可以是web浏览器、SQL引擎或其他许多东西)时,您应该清理这些数据,最好的方法是使用您正在使用的库附带的专用函数。

如果可以输出给用户,您必须防止潜在的恶意用户在其代码中包含HTML标记。例如,如果在那篇文章中,我可能会包含一个
脚本
标记,这对任何阅读我文章的用户来说都是非常危险的。要防止出现这种情况,请使用:

这样,我的
标记将被翻译为
脚本
,这样在浏览器中显示时不会对用户造成伤害

现在,如果您想在数据库中保存我的帖子,您必须小心SQL注入。假设您正在使用该查询保存我的帖子(是的,您不应该使用
mysql.*
函数,因为它们已被弃用,但这只是为了解释这个想法):

听起来不错?好吧,如果我很讨厌,我会尽量把那个帖子包括进去:

test'); DELETE FROM posts; SELECT * FROM posts WHERE data = '
你的MySQL得到的是

INSERT INTO posts(data) values('test'); DELETE FROM posts; SELECT * FROM posts WHERE data = '');
哎哟。因此,您必须基本上防止您的用户在其帖子中包含引号和双引号,或者更准确地说,您应该避开它们。这实际上取决于您使用的库,但在我使用的过时库中,这将被写入:

$really_clean_data = mysql_real_escape_string($db, $clean_data);
mysql_query($db, "INSERT INTO posts(data) values('$really_clean_data');");
因此,通过上面的恶意帖子,MySQL现在将收到

INSERT INTO posts(data) values('test\'); DELETE FROM posts; SELECT * FROM posts WHERE data = \'');
现在,对于MySQL,整个
插入POST(数据)值('test');删除职位;从数据为“”的帖子中选择*部分是一个正确的字符串,所以发生的事情就是您想要发生的事情


基本上,在几乎所有的情况下,这就是你所需要的。请记住,当您将用户数据提供给解释器(它可以是web浏览器、SQL引擎或其他许多东西)时,您应该清理这些数据,最好的方法是使用您正在使用的库附带的专用函数。

只是为了补充Fabien已经给出的答案,文本数据类型不是您需要关注的唯一项目。数字同样重要。类型转换变量是处理这个问题的一种方法。比如说,

$really_clean_data = mysql_real_escape_string($db, $clean_data);
$query = "UPDATE posts SET post = '".$really_clean_data."' WHERE id = '".(int)$_POST['id']."'";
if(strlen($_POST['username']) > 24){
    $error = "username is too long";
}
所有提交的数据,包括你将要更新的帖子的id号,都和文本区域或文本输入条目一样可疑,并且容易被恶意篡改。当您知道它应该是整数(数字)时,您可以将其转换为整数。如果不是数字,则(int)将其转换为0。无法更新第0行,因此SQL查询将失败

要在执行查询之前检查该故障,可以使用is_numeric()函数检查已发布的数据,查看它是否是一个数字

if(!is_numeric($_POST['id'])){
    die("Post id is not a number.");
}
对于输入字段,尤其是用户名和密码字段,可以设置最大长度并进行检查。比如说,

$really_clean_data = mysql_real_escape_string($db, $clean_data);
$query = "UPDATE posts SET post = '".$really_clean_data."' WHERE id = '".(int)$_POST['id']."'";
if(strlen($_POST['username']) > 24){
    $error = "username is too long";
}

如果你能在这方面有所创新,防止SQl注入实际上是很有趣的!请记住,一年后,本页上的所有内容都可能完全过时和不相关。安全性是一个过程,而不是一个步骤,所以请继续关注它。

为了补充Fabien已经给出的答案,文本数据类型不是您需要关注的唯一项目。数字同样重要。类型转换变量是处理这个问题的一种方法。比如说,

$really_clean_data = mysql_real_escape_string($db, $clean_data);
$query = "UPDATE posts SET post = '".$really_clean_data."' WHERE id = '".(int)$_POST['id']."'";
if(strlen($_POST['username']) > 24){
    $error = "username is too long";
}
所有提交的数据,包括你将要更新的帖子的id号,都和文本区域或文本输入条目一样可疑,并且容易被恶意篡改。当您知道它应该是整数(数字)时,您可以将其转换为整数。如果不是数字,则(int)将其转换为0。无法更新第0行,因此SQL查询将失败

要在执行查询之前检查该故障,可以使用is_numeric()函数检查已发布的数据,查看它是否是一个数字

if(!is_numeric($_POST['id'])){
    die("Post id is not a number.");
}
对于输入字段,尤其是用户名和密码字段,可以设置最大长度并进行检查。比如说,

$really_clean_data = mysql_real_escape_string($db, $clean_data);
$query = "UPDATE posts SET post = '".$really_clean_data."' WHERE id = '".(int)$_POST['id']."'";
if(strlen($_POST['username']) > 24){
    $error = "username is too long";
}
如果你能在这方面有所创新,防止SQl注入实际上是很有趣的!请记住,一年后,本页上的所有内容都可能完全过时和不相关。