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?