PHP安全编程

Posted by 妖刀 26 May, 2007

1. 过滤输入数据
最重要的原则之一就是:“永远不要相信用户输入的任何数据。”过滤输入数据是防止SQL注入的有效方法。
function add_magic_quotes($array)
{
foreach ($array as $k => $v) {
if ( is_array($v) ) {
$array[$k] = add_magic_quotes($v);
} else {
$array[$k] = addslashes($v);
}
}
return $array;
}
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
function strip_slashes()
{
// If already slashed, strip.
if ( get_magic_quotes_gpc() ) {
$_GET = stripslashes_deep($_GET );
$_POST = stripslashes_deep($_POST );
$_COOKIE = stripslashes_deep($_COOKIE);
$_SERVER = stripslashes_deep($_SERVER);
}
$_GET = add_magic_quotes($_GET );
$_POST = add_magic_quotes($_POST );
$_COOKIE = add_magic_quotes($_COOKIE);
$_SERVER = add_magic_quotes($_SERVER);
}

2. 过滤输出数据
对任何要在HTML页面上显示的数据,必须经过过滤,否则就是引入了“跨站脚本攻击(XSS)”的危险。

$html = array();
$html['username'] = htmlentities($clean['username'], ENT_QUOTES, 'UTF-8');
echo "Welcome, {$html['username']}.";

记得使用htmlentities 防止XSS。

3. 使用SESSION跟踪
对于需要授权才能访问的页面,记得使用SESSION验证用户权限。

$user = $_SESSION['user'];
if ($_SESSION['verified']) ...

4. 防止文件上传攻击

使用is_uploaded_file() 和 move_uploaded_file() 防止文件上传攻击
还可以使用filesize() 来校验文件的大小

5. 使用Token和时间戳

$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
$_SESSION['token_time'] = time();
?>


if (isset($_SESSION['token']) && $_POST['token'] == $_SESSION['token'])
{
$token_age = time() - $_SESSION['token_time'];
if ($token_age <= 300)
{
}
}

防止请求伪造、会话劫持。

6. 其他

$_SERVER['HTTP_REFERER']
$_SERVER['HTTP_USER_AGENT']

Categories : 技术 / 设计 Tags :

Comments

No comments yet.


Leave a comment

(required)

(required)