PHP输入GET变量消毒

对于我用PHP 5+编写的应用程序,我有一个common.php ,它包含在所有其他页面中。 在那里我有一个include sanitize.php ,它旨在清理URL中使用的任何输入变量。 所以,定位$_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中使用密码的看法。 我会更详细地解释一下。 而不是使用带有用户名和密码的POST登录提示,而是使用带有用户名和密码参数的_db_tryLogin.php的ajax异步调用。 用户名始终是6-ALPHA-only文本字符串,密码是输入内容的md5。 我意识到MD5的意见不够“安全”。

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

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

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

我使用MD5作为异步请求,以便快速散列密码,以便它不会以纯文本形式传输。

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

DB密码存储= md5(SALT.md5(plainpass))


你在干什么? 如果你[只]试图保护你的SQL数据库,那么你做错了,应该查看Prepared Statements

用户提交的数据绝不可信。 接受,是的,值得信赖 - 没有。

与其经过一个冗长乏味的允许某些特征字符的过程,不如简单地禁止(即删除)不想接受的字符,如非字母数字或倒角字符等。它也可以为您节省大量的努力来使用PHP strip_tags()函数。

1)在包含文件中创建你的函数。 我会建议在一个抽象的静态类中创建它,但这超出了这个答案的范围。

2)在这个函数/类方法中,为你要查找的坏字符以及这些检查将应用的数据添加定义。 您似乎对自己的逻辑过程有了一个好主意,但请注意,没有明确正确的代码答案,因为每个程序员的字符串需求都不相同。

3)使用(2)中定义的标准,然后可以使用Regex删除无效字符以返回一组“安全”变量。

例:

   // 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过滤器验证它们准确适合您的情况。

6)不要信任输出数据,即使它通过了所有可以提供的检查和正则表达式,但仍有可能通过。 总是非常谨慎的用户提交的数据。 永远不要相信它。

7)为您的SQL交互使用准备好的语句。

8)作为数字类型的快捷方式(int / float),你可以使用PHP类型强制转换来强制给定的变量作为某种类型,并摧毁任何其他的机会:

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

笔记:

  • 密码应该az而已,但你可以从越多,最好选择应该是尽可能多的字符。

  • 如果您在此处采取的行动是为了保护数据库安全性和完整性,那么您就错了,并且应该使用Prepared Statements用于MySQL交互。

  • 停止使用var来声明变量,因为它来自PHP4并且非常旧,所以使用Variable preconditional $ (比如$variable = true; )要好得多。

  • 你说:

    我们有一个欧洲的用户群,所以不同的区域设置是可能的

    我强烈建议探索PHP mb_string函数,因为本机PHP不是安全的。


  • 我会开始只是每个变量的正则表达式,如果它不符合要求,则应用null。 既可以测试它应该拥有什么,也可以测试它不应该拥有的,以较小者为准:

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

    带有参数输入aka的准备语句

    $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

    链接地址: http://www.djcxy.com/p/96575.html

    上一篇: PHP input GET vars sanitizing

    下一篇: how to get Factory Class to create object instances in PHP?