php在安全方面的作用,php-最终的清理/安全功能

php-最终的清理/安全功能

我从$_GET和$_GET['blabla']有很多用户输入...目前,我总是写$_POST['haha']。

我想知道您是否可以创建一个功能来立即保护,转义和清理$_GET['blabla']/$_POST['haha']数组,因此您不必每次使用用户输入时都进行处理。

我正在考虑一个函数,例如$_GET['blabla'],并且在它内部应该执行$_POST['haha']、htmlspecialchars、strip_tags、stripslashes(我想这是为了使其干净和安全),然后返回$input。

那有可能吗? 制作一个适用于所有$_GET['blabla']和$_POST['haha']的函数,因此您只需要这样做:

$_GET = cleanMe($_GET);

$_POST = cleanMe($_POST);

因此,在以后的代码中,当您使用$_GET['blabla']或$_POST['haha']时,它们是否被固定,剥离等?

试了一下自己:

function cleanMe($input) {

$input = mysql_real_escape_string($input);

$input = htmlspecialchars($input, ENT_IGNORE, 'utf-8');

$input = strip_tags($input);

$input = stripslashes($input);

return $input;

}

7个解决方案

126 votes

通用卫生功能的概念是一个破损的概念。

每种目的都有一种正确的卫生方法。 在字符串上不加选择地运行它们通常会破坏它-为SQL查询转义一段HTML代码会破坏它在网页中的使用,反之亦然。 在使用数据之前,应立即进行卫生处理:

在运行数据库查询之前。 正确的卫生方法取决于您所使用的图书馆。 我如何防止PHP中的SQL注入中列出了它们?

escapeshellarg()用于安全的HTML输出

escapeshellarg()用于正则表达式

escapeshellarg()/escapeshellcmd()用于外部命令

等等等

使用“一刀切”的卫生功能就像在植物上使用五种剧毒杀虫剂一样,根据定义,这些杀虫剂只能含有一种虫子-只是发现您的植物受到了第六种虫子的侵扰,而第六种却没有 的杀虫剂起作用。

始终使用一种正确的方法,最好是直接使用,然后再将数据传递给函数。 除非需要,否则不要混合使用方法。

Pekka 웃 answered 2019-11-03T20:44:32Z

7 votes

仅通过所有这些功能传递输入是没有意义的。 所有这些功能具有不同的含义。 通过调用更多的转义函数,数据不会变得“干净”。

如果要在MySQL中存储用户输入,则只需要使用&016。然后将其完全转义以安全地存储在数据库中。

编辑

还请注意使用其他功能时出现的问题。 例如,如果客户端向服务器发送用户名,并且该用户名包含“&”号(&),则您不希望在将其存储在数据库中之前调用&017,因为这样数据库中的用户名将包含&。

Tomas answered 2019-11-03T20:45:13Z

6 votes

您正在寻找filter_input_array()。但是,我建议仅将其用于业务样式的验证/清除,而不是SQL输入过滤。

为了防止SQL注入,请对mysqli或PDO使用参数化查询。

Alan Pearce answered 2019-11-03T20:45:46Z

3 votes

问题是,某种用途的清洁或安全性不会用于另一种用途:清洁路径的一部分,mysql查询的一部分,html输出(例如html,javascript或输入值)中的内容, 对于xml可能需要不同的东西,这是矛盾的。

但是,可以做一些全局性的事情。尝试使用filter_input获取用户的输入。 并对SQL查询使用准备好的语句。

尽管您可以创建一些类来管理输入,而不是执行全部操作。 像这样:

class inputManager{

static function toHTML($field){

$data = filter_input(INPUT_GET, $field, FILTER_SANITIZE_SPECIAL_CHARS);

return $data;

}

static function toSQL($field, $dbType = 'mysql'){

$data = filter_input(INPUT_GET, $field);

if($dbType == 'mysql'){

return mysql_real_escape_string($data);

}

}

}

有了这种事情,如果您在代码中看到任何$ _POST,$ GET,$ _ REQUEST或$ _COOKIE,就知道必须进行更改。 而且,如果有一天您必须更改对输入内容的过滤方式,只需更改您制作的课程即可。

Arkh answered 2019-11-03T20:46:32Z

1 votes

如果您使用的是apache并具有对服务器的完全访问权限,我可以建议安装“ mod_security”吗?

它确实解决了我的大多数问题。 但是,不要只依靠一种或两种解决方案,总要编写安全的代码;)

更新找到了这个PHP IDS([http://php-ids.org/);]看起来不错:)

Filipe YaBa Polido answered 2019-11-03T20:47:10Z

0 votes

function sanitizeString($var)

{

$var = stripslashes($var);

$var = strip_tags($var);

$var = htmlentities($var);

return $var;

}

function sanitizeMySQL($connection, $var)

{

$var = $connection->real_escape_string($var);

$var = sanitizeString($var);

return $var;

}

?>

vuchkov answered 2019-11-03T20:47:30Z

-1 votes

我用那个传递数组或get,post

function cleanme(&$array)

{

if (isset($array))

{

foreach ($array as $key => $value)

{

if (is_array($array[$key]))

{

secure_array($array[$key]);

}

else

{

$array[$key] = strip_tags(mysql_real_escape_string(trim($array[$key])));

}

}

}

}

用法:

cleanme($_GET);

cleanme($_POST);

user889030 answered 2019-11-03T20:47:57Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值