PHP安全性的笔记
(1) SQL注入防护措施
SQL 使用 prepare() 来编写。
在这里,变量使用“?”。不要使用“.”等符号来连接变量。
$user_id = "1234";
$kind = "test";
$sql = "SELECT id, data FROM table_name WHERE id=? AND kind=?";
$stmt = $pdo->prepare($sql);
$stmt->bindParam( 1, $user_id, PDO::PARAM_STR); // 1つめの ? に 1234
$stmt->bindParam( 2, $kind, PDO::PARAM_STR); // 2つめの ? に test
$stmt->execute();
(2) 防御XSS攻击
如果要在屏幕上显示变量,可以使用htmlspecialchars()。
echo '<h1>idは'.htmlspecialchars($user_id).'です。</h1>';
(3) 防御脚本注入攻击
用户在屏幕上输入的字符等应该去除 HTML 标签和 PHP 标签,这样才安全可靠。
$comment = strip_tags($_POST["comment"])
(4) 防御跨站请求伪造
登录后执行 session_regenerate_id。
session_regenerate_id(true);
在注销后,执行session_destroy。
// セッションクリア
session_destroy();
(5) CSRF防御措施之二
在用户选择信息并点击确定按钮后,在目标页面上使用SQL更新数据(INSERT,UPDATE,DELETE)。选择的信息通过GET数据传递。
在用户保持登录会话的情况下,如果恶意页面访问目标页面的URL,将会发出意料之外的SQL。
为防止此类情况,可以通过在源页面和目标页面之间传递令牌等方式来确认正确的来源。
迁移来源
// ランダムな8桁の数字でトークンを作る
$token = random_int( 10000000, 99999999 );
// セッションにトークンを入れる
$_SESSION["TOKEN"] = $token;
// URLにもトークンを入れる
echo '<a href="next.php?token='.$token.'">次のページ</a>';
迁移目的地
// セッションとURLのトークンが一致しなかったら処理しない
if( $_SESSION["TOKEN"] != $_GET["token"] ) {
die("トークンが一致しません。");
}
(6) 防止点击劫持
在.htaccess文件中写下以下命令。
Header set X-FRAME-OPTIONS "DENY"
在开始编写PHP的HTML之前,可以调用header()函数。
<?php
// クリックジャッキング対策
header('X-FRAME-OPTIONS: DENY');
?>
<!doctype html>
<html>
…
确认防止点击劫持的措施是否已经生效。
按照以下方式创建一个适当的文件(hoge.html)。
将想要测试的URL放在“http://…/index.php”的部分。
如果没有采取任何措施,页面会显示内容,但是如果实施了点击劫持防护措施,页面将变为空白。
<html>
<iframe src="http://…/index.php" width="800" height="1000">
</iframe>
</html>