【发布时间】:2013-01-28 13:23:05
【问题描述】:
显然,您应该在服务器端验证所有用户输入数据。我只是好奇什么被认为是“正确的”输入验证以及应该完成的顺序。
到目前为止(以及过去的最近项目)我都是这样做的:
获取用户输入,实例化对象,调用方法:
if(isset($_POST['addCat'])) {
$db = new DBConnection;
$categories = new Category($db);
if($categories->insert_cat($_POST['name']) === TRUE) {
echo "Category Inserted Successfully!";
}
}
从实例化对象中调用的方法:
1.转义用户输入
2。实例化 data_validation 对象(请参阅下面的验证对象)
class Categories {
public function insert_cat($catName) {
$catName = $this->mysqli->real_escape_string($catName);
$validate = new data_validation;
if(!($validate->validate_string($catName))) {
echo "Invalid characters found in category name";
die();
}
$query = $this->mysqli->query("INSERT INTO categories(name) VALUES ('".$catName."')");
if($query === false) {
printf("Error: %s\n", $this->mysqli->error);
die();
} else {
return true;
}
}
}
data_validation 类其中:
1.修剪数据
2。将数据与正则表达式匹配
3。将数据返回给insert_cat方法进行数据库插入
class data_validation {
public function validate_string($data) {
// Remove excess whitespace
$data = trim($data);
if ( preg_match("/^[0-9A-Za-z \.\-\'\"]+$/", $data) ) {
return true;
} else {
//return 'Not a valid string';
return false;
}
}
}
所以基本上简而言之,我的问题是:首先转义数据,然后修剪它,然后将其与正则表达式进行比较,然后添加 htmlentites() 或类似的东西来保留任何格式是否合适,或者应该是以不同的顺序完成?
非常欢迎任何改善我的安全习惯的提示!
【问题讨论】:
-
格式清理首先出现,然后数据库在 SQL 查询之前转义。在相关说明中,如果您要使用 prepared statements,则可以跳过 SQL 转义。 --
htmlentities应该在输出之前先应用。 -
所以我先转义用户输入不是问题吗?我可以使用用户准备好的语句,但我不熟悉 PDO。我以为
htmlentities是为了在数据库中保存html实体,那么你用html_entity_decode解码html实体? -
哎呀,是的。那么就错了。逃跑必须是最后一步。 mysqli 也允许参数绑定。
htmlentities与数据库无关。它在将文本写入 HTML 上下文(=页面输出)时使用,而不是之前。 -
你应该在mysqli中使用参数化查询来防止注入。请参阅:php.net/manual/en/mysqli-stmt.bind-param.php 另外,考虑到在以某种方式(输出、用于计算等)使用或操纵用户输入之前,无需对用户输入进行清理。
-
是的,这是正确的 Ty,参数化查询与准备好的语句相同。它们易于学习,并为您的应用程序增加了一层巨大的安全性。您可以使用准备好的语句将用户输入直接存储到数据库中,并且无需清理或转义任何输入,因为准备好的语句将为您执行此操作。唯一需要对任何用户输入进行转义或清理的时候是在操作或输出数据时。即:验证数据格式是否正确,或确保用户没有尝试在您的页面上执行 html/JS 代码(htmlentities)。
标签: php regex validation