【发布时间】:2017-09-09 22:10:49
【问题描述】:
对于我用 PHP 5+ 编写的应用程序,我有一个 common.php,它包含在所有其他页面中。其中我有一个include sanitize.php,它旨在清理 URL 中使用的任何输入变量。所以,定位$_GET[] 值。
这只是为了有一个地方我可以整理任何变量(如果使用),然后在代码中使用它们。
据我所知,似乎没有整洁的方法可以根据预期/期望的输入进行清理。我最初查看的方法是 sanitize.php 有一个 foreach 循环遍历任何变量,查找所需的清理类型,然后将清理后的变量添加到单独的数组中以在我的代码中使用。
为了保持标准,我想我会使用正则表达式,而不是使用 PHP 清理过滤器。我想要的类型是 alphaonly、alphanumeric、email、password。尽管“密码”允许使用一些特殊字符,但我想删除甚至逃避潜在的“危险”字符,例如 ' ",然后将其包含到 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 登录提示,而是使用带有用户 ID 和密码参数的 _db_tryLogin.php 的 ajax 异步调用。用户名始终是一个 6-ALPHA-only 文本字符串,密码是输入内容的 md5。我知道关于 MD5 不够“安全”的观点。
JS 当前 MD5s 密码并将其发送到_db_tryLogin.php。
-> async : _db_login.php?c=ABCDEF&p=SLKDauwfLKASFUWPOjkjafkKoAWOIFHF2733287
这将返回“1”或“0”的异步响应。两者都会导致页面刷新,但如果_db_tryLogin.php 页面检测到密码并且用户ID 与一条数据库记录匹配,则设置会话变量并且站点知道用户已登录。
我将 MD5 用于异步请求,只是为了快速散列密码,使其不会以明文形式传输。
_db_tryLogin.php 获取密码,即md5(plainpass) 再次添加 SALT 和 MD5s,然后与 DB 中的用户表进行比较。
存储的数据库密码 = md5(SALT.md5(plainpass))
【问题讨论】:
-
而不是经历允许某些字符的冗长乏味的过程,只需禁止(即删除)您不想接受的字符,例如非字母数字或反引号字符等。使用PHP
strip_tags()函数也可以为您节省很多精力。 -
您在这方面花了一些心思。但它通常被认为是错误的方法。不要将输入视为“危险”,而是查看您的数据库 API 使用情况。转义和清理始终是特定于上下文的;不是一个全面的安全小发明。
-
您要针对什么进行消毒?如果您 [仅] 试图保护您的 SQL 数据库您做错了,应该查看Prepared Statements。
-
@Martin 我的主要议程是防止注入,并且页面使用它知道受信任的变量
-
@Jammo 他们的观点是这还不够,如果你希望找到一份工作,那么它不会被接受为一种在安全环境中编程的方法
标签: php validation input code-injection sanitization