对于我的应用程序,用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))
而不是通过允许某些chararacters,根本不允许* *的漫长繁琐的过程会(即删除)字符你不想接受,如非字母数字或反引号括等它也可以为您节省大量的努力来使用PHP'strip_tags()'函数。 – Martin
你在这方面花了一些心思。但它通常被认为是错误的方法。而不是将输入视为“危险”,请查看您的数据库API使用情况。逃避和消毒始终是针对具体情况的;不是一个全面的安全小发明。 – mario
你对什么是消毒?如果你[只]试图保护你的SQL数据库**你做错了,并应该查看* Prepared Statements ***。 – Martin