2017-04-13 101 views
1

对于我的应用程序,用PHP 5+编写,我有一个common.php,其中包含所有其他页面。其中我有一个include sanitize.php,其目的是消除URL中使用的任何输入变量。所以,目标$_GET[]值。PHP输入GET变量消毒

这只是有一个地方,我可以整理任何变量,如果使用,并在代码中使用它们。

基于预期/期望的输入,似乎没有整洁的方式来净化。我最初看到的方法是这个sanitize.php有一个foreach循环遍历所有变量,查找所需的清理类型,然后将清理后的变量添加到单独的数组中以供我的代码使用。

而不是使用PHP消毒过滤器,为了保持它的标准,我想我会使用正则表达式。我想要的类型是alphaonly,字母数字,电子邮件,密码。虽然“密码”会允许一些特殊字符,但我想要删除甚至是逃避潜在的“危险”字符,如'"然后被包含到mysql数据库中。我们有一个欧洲的用户群,所以可能有不同的地区,但我希望这不会成为太大的问题。

这是一个“好”的解决方案,或者我试图重新发明轮子?

随机页

/mypage.php?c=userid&p=lkasjdlakjsdlakj&z=.... 
(use SANITIZED_SAFE_INPUT_VARS variable only) 

sanitize.php

var aryAllowedGetParamNames = array(
    "c" => "alphaonly",   //login 
    "p" => "alphaemail",  //password 
    "e" => "email"    //email 
    //... 
); 

var sanitizeTypes = array (
    "alphaonly" => "[a-zA-Z]", 
    "alphanumeric" => "[a-zA-Z0-9]", 
    "email" => "[a-zA-Z0-9]...etc" 
); 

var SANITIZED_SAFE_INPUT_VARS = array(); 

foreach ($_GET as $key => $value) { 
    //apply regex and add value to SANITIZED_SAFE_INPUT_VARS 
} 

编辑

似乎有大约在URL中使用密码的一些意见。我会更详细地解释一下。我使用带有用户名和密码参数的_db_tryLogin.php的ajax异步调用,而不是使用用户名和密码的POST登录提示。用户名始终是6-ALPHA-only文本字符串,密码是输入内容的md5。我意识到MD5的意见不够“安全”。

JS当前MD5的密码并将其发送到_db_tryLogin.php

-> async : _db_login.php?c=ABCDEF&p=SLKDauwfLKASFUWPOjkjafkKoAWOIFHF2733287 

这将返回“1”或“0”的异步响应。两者都会导致页面刷新,但如果_db_tryLogin.php页面检测到密码并且用户标识符匹配一个数据库记录,则将设置会话变量并且该站点知道用户已登录。

我使用MD5作为异步请求快速散列密码,以免它以明文形式传输。

_db_tryLogin.php需要密码,这是md5(plainpass)再次添加一个SALT和MD5s,然后这就是与DB中的usertable进行比较。

存储的DB密码= md5(SALT。md5(plainpass))

+0

而不是通过允许某些chararacters,根本不允许* *的漫长繁琐的过程会(即删除)字符你不想接受,如非字母数字或反引号括等它也可以为您节省大量的努力来使用PHP'strip_tags()'函数。 – Martin

+0

你在这方面花了一些心思。但它通常被认为是错误的方法。而不是将输入视为“危险”,请查看您的数据库API使用情况。逃避和消毒始终是针对具体情况的;不是一个全面的安全小发明。 – mario

+0

你对什么是消毒?如果你[只]试图保护你的SQL数据库**你做错了,并应该查看* Prepared Statements ***。 – Martin

回答

1

什么是消毒?如果你[只]试图保护你的SQL数据库你做错了,应该看看准备好的语句

用户提交的数据应该是从不被信任。接受,是的,值得信赖的 - 不是

而不是经历一个冗长乏味的过程允许某些字符,只是不允许(即删除)你不想接受的字符,如非字母数字或反向字符等。它也可以为您节省很多努力来使用PHP strip_tags()函数。

1)在包含文件中创建你的函数。我会建议在abstract Static Class中创建它,但这有点超出了这个答案的范围。

2)在此函数/类方法中,添加您要查找的字符以及这些检查将应用于的数据的定义。您似乎对自己的逻辑过程有了一个好主意,但请注意,由于每个程序员对字符串的需求都不相同,因此不存在确切的代码答案。 3)使用(2)中定义的标准,您可以使用正则表达式去除无效字符以返回一组“安全”的变量。

例如:

// Remove backtick, single and double quotes from a variable. 
    // using PCRE Regex. 
    $data = preg_relace("/[`"']/","",$data); 

4)使用PHP函数strip_tags()只是做到这一点,从一个字符串中删除HTML和PHP代码。

5)对于电子邮件验证使用PHP $email = filter_var($data, FILTER_SANITIZE_EMAIL);函数,它会比你自己的简单正则表达式好得多。 使用PHP Filter Validations他们准确地为您的情况。

6)NEVER信任的输出数据,即使通过了所有检查和正则表达式,你可以给它,东西仍然可以打通。总是非常谨慎的用户提交的数据。 从来没有信任它。

7)使用准备好的语句进行SQL交互。

8)对于数字类型的快捷方式(INT /浮动),你可以使用PHP的类型转换到给定的可变因素来作为某种类型并摧毁它是别的任何的机会:

$number = $_GET['number']; //can be anything. 
$number = (int)$_GET['number']; //must be an integer or zero. 

注:

  • 密码应a-z而已,但你可以从选择应该是尽可能多的字符,多多益善。

  • 如果您actioning这里的努力,都是为了保护数据库的安全性和完整性的情况下,你这样做是错误的,并应该使用预处理语句为你的MySQL互动。

  • 使用var声明变量,因为这是从PHP4 and is VERY old停止,它远远最好使用可变预条件$(如$variable = true;)。

  • 幽州:

    我们有一个欧洲的用户群等不同的语言环境是可能的

    对此我会强烈建议探索PHP mb_string functions因为PHP本身不mutlibyte安全。

0

我会刚刚开始正则表达式每个变量,如果它不符合要求应用null。这两项测试中它应该只,或什么不应该,取其较小者:

$safeValue = (preg_match('/^[a-zA-Z0-9]{0,5}$/',$value) ? $value : ""); 

随着与参数输入预处理语句又名

$query = "SELECT x FROM table WHERE id=?"; 
bind_param("si",$var,$var) 

PHP还内置滤镜进来,如电子邮件和其他)。例如:filter_var($data, FILTER_SANITIZE_EMAIL)

http://php.net/manual/en/filter.filters.sanitize.php

+0

应用'false'而不是null看起来更合乎逻辑,因为if'语句('===')可以定义它无法正确传递正则表达式。但是这种细节是我想到的OP。 – Martin

+0

@Martin通常后来我使用if($ var!=“”){},因此。我完全清空它。 – clearshot66