PHP
PHP(ピー・エイチ・ピー)は、動的にHTMLデータを生成することによって、動的なウェブページを実現することを主な目的としたプログラミング言語、およびその言語処理系である。
Hypertext Preprocessorの略。なんでこれを略してPHPになるのかは不明。
HTMLのソースの中に<?php ?>のタグを埋め込むことで動作させることができ、連携がやりやすい。
PEARというライブラリがありなにかと便利。
サンプルソース:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>PHPのテスト</title>
</head>
<body>
<?php
<h1>
print "今日は{date('Y'年'n'月'd'日)}です。
</h1>
<p></p>
?>
</body>
</html>
とすると、今日は2007年1月15日です。と表示される。
適当なコードを書くと、XSS(クロスサイトスクリプティング)、ScriptInjection(スクリプトインジェクション)、SQLインジェクションなどの攻撃に対してリスクを抱えることになり危険。
注意すべきコード
$_SERVER['PHP_SELF']
htmlspecialchars($_SERVER['PHP_SELF'],ENT_QUOTES)
とするほうがいいらしい。$_REQUEST['hoge']
$_GET['hoge'],$_POST['hoge'],$_COOKIE['hoge']
などに限定しないと外部から変数を書き換えられる可能性あり- バイナリセーフでない関数
-
バイナリセーフでないとは文字列中にヌルバイトがあった場合、それ以降の文字列を読み込まないこと。
ereg_replace()
などをサニタイジングに使うと危険。preg系はバイナリセーフで処理速度もereg系の数倍速いらしいのでこちらを代用。mb_ereg()はバイナリセーフ。 - ereg_replace(),eregi(),eregi_replace()
- split(),spliti()
- require(),require_once()
- include(),include_once()
- fopen(),file_get_contents(),readfile(),basename()
- SQL文の作成
-
ユーザ変数をそのまま入力しない
MySQLであればmysql_escape_string(),mysql_real_escape_string()などでサニタイジング できる。mysql_real_escape_stringはDBに接続した状態でないと使用不可。 - PEARのDBクラスを使うのであれば「プレイスホルダ」というものを使うことができる。
-
<?php $db=DB::connect("mysql://username:password@hostname/database_name"); $params="hoge"; $sql="SELECT * FROM $dbname WHERE culumn1=?"; $db->query($sql,$params); ?>