0

在接下来的几天里,我必须保护一个网站(我做了)我想我会写到 config.php 文件(在所有 php 页面中调用)

while($value = current($_POST)){
    $_POST[key($_POST)]=htmlentities($value);
    next($_POST);
}

在 config.php 中,您认为我会因各种 xxs 和 sql 注入而成为 siscuro 吗?我知道必须以不同的方式验证每个字段,并且数据库最好不要包含 html 实体。

1)除了发布,获取(也许是请求)我应该过滤哪些其他变量?2)这种方法使我免受多次代码注入(xxs,sql注入等..)的影响?

编辑:如果我放 mysql_real_escape_string 而不是 htmlentities 会更好?我想通过数据验证等来确保安全性不完整……但要防止注入:sql和xxs以及其他注入

编辑:当然,如果您使用“ddd”也将提供我删除 php 标签的功能(尽管我确信该网站不会运行)

谢谢 :)

4

4 回答 4

2

请不要在同一个句子中使用“安全”和“快速”这两个词。它可能不会很好地结束...... :)

正如您已经提到的,不将 HTML 实体存储在数据库中会更“干净”,而是htmlentities在显示输出时应用(或者您使用为您处理转义的模板引擎)。

htmlentities对 SQL 注入没有帮助(想象一下htmlentities("' OR 1=1 --"))。你需要类似的东西mysql_real_escape_string——$pdo->quote尽管准备好的陈述是最好的方法。

但是,这很难(如果不是不可能的话)应用在顶层方法中。最好看看您使用的 SQL 语句,并用准备好的语句替换它们,或者至少转义您在这些查询中使用的任何输入参数。

于 2013-01-23T11:20:22.207 回答
2

如果是那么简单,每个人都会这样做。没有人会建议使用良好的实践来编写安全代码。这不是要走的路。有时您可能确实需要数据库中的那些值,这些值可能会被您的“包罗万象”代码错误地更改。包罗万象不是安全验证机制的方法。

在接下来的几天里,我将不得不保护一个网站

如果您继续尝试以这种方式保护您的网站,那么它最多只能在接下来的几天内保持安全。

于 2013-01-23T11:20:36.830 回答
1

虽然在构建站点时执行此类操作通常是个好主意。不同的网站需要不同的安全级别是合乎逻辑的。只有您访问的本地网站可能不需要,而小型“内部网”风格的网站可能只需要基本的安全性。

如果您认为该站点只需要可以在几天内实施的安全级别。然后我会说第一步是返回并确保所有用户输入都通过一个mysql_real_escape_string()函数或类似函数运行,具体取决于您的 API(看起来这个函数现在实际上已经被贬值了)。此函数转义特殊字符,以便将其放在 MySQL 查询中是安全的。

其次,在某些情况下,您可以使用诸如preg_match()检查字符串是否与预期输入匹配的函数。这意味着您可以检查地址是否与地址格式匹配,并且与姓名和电话号码等相同。这意味着您可以轻松地限制长度和数据类型。

我认为这是保护网站的第一步,这意味着用户不能(微不足道地)将他们喜欢的任何内容保存到您的数据库中。

于 2013-01-23T11:55:08.217 回答
0

The best approach is to define data-type for each input, not just globally filter all input data as you proposed. for example: Consider these fields: Name: E-Mail: Age: Country: Address: Phone Number: Plain text (textarea): file (file upload):

Now, if you want to secure these fields, you have to deal with each of them individually. 1- Name: define maximum character length and data type (format), usually Name consists of only (A-z and space) and sometimes one single quota ('), or a dot (.) will be there if someone entered a title like Eng. Mr. now, lets check that field, consider

<?php
$name = $_POST['name'];
$name_max_length = 30;
$name_min_length = 5;
$name_pattern = "/[a-zA-Z'\.\ ]{$name_min_length, $name_max_length}/";
if(!preg_match($name_pattern, $name)){
 $error[] = "Please enter valid character for name field";
}else{
 //lets now filter it for safe input
 //above check not passes any kind of XSS, but it passes SQL injection
 //we need to clear it from SQL injection 
 $name = htmlentities($name, ENT_QUOTES);
 //ENT_QUOTES: Will convert both double and single quotes.
}
?>

2- Age: it must be integer, you can simply check it with built-in PHP function:

<?php
$age = $_POST['age'];
if(!is_int($age)){
$error[] = "Please enter valid number in Age field";
}
?>

3- Plain text: again, use htmlentities($name, ENT_QUOTES) 4- File upload: - Check file extension, you have to create list of white-extensions and then compare uploaded file extension with white list for example:

<?php
$extensions = array('png', 'jpeg', 'gif');
if(!in_array($current_file_ext, $extensions)){
 $error[] = "Please select valid file type! (".implode(", ", $extensions);
}
?>

Finally, before entering these data, check $error which an array if such error occured

<?php 
if(count($error) > 0){
 //means $error contains errors
 //print error values
}else{
 //start inserting your data into database
}
?>
于 2013-01-23T11:43:13.143 回答