ホームページ >バックエンド開発 >PHPチュートリアル >PHP アンチ SQL インジェクション クラスは機密パラメータをフィルタリングできます_PHP チュートリアル
この記事には、考えられるほぼすべての PHP の SQL インジェクション対策コードがまとめられていますので、参考にしてください。
XP_CMDSHELLの実行可能性を判断する
WEB仮想ディレクトリを発見する
ASP、php、jsp トロイの木馬をアップロードします;
管理者権限を取得する;
//PHP サイト全体のアンチインジェクション プログラム、パブリック ファイルにこのファイルを require_once する必要があります
//magic_quotes_gpc ステータスを決定する
if (@get_magic_quotes_gpc ()) {
$_GET = 秒 ( $_GET );
$_POST = 秒 ( $_POST );
$_COOKIE = 秒 ( $_COOKIE );
$_FILES = 秒 ( $_FILES );
}
$_SERVER = 秒 ( $_SERVER );
関数 sec(&$array) {
// 配列の場合は、配列を走査して再帰的に呼び出します
If (is_array ( $array )) {
foreach ( $array as $k => $v ) {
$array [$k] = sec ($v);
} else if (is_string ( $array )) {
//addlashes 関数を使用して処理
$array = まつげを追加します ( $array );
} else if (is_numeric ( $array )) {
$array = intval ($array);
}
$配列を返します
}
1.整数パラメータの判定
入力パラメータ YY が整数の場合、通常、abc.asp 内の元の SQL ステートメントはおおよそ次のようになります:
select * from table name where field=YY なので、次の手順を使用して SQL インジェクションが存在するかどうかをテストできます。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(シングルクォーテーション付き) このとき、abc.ASPのSQL文は
となります。
select * from table name where field=YY’、abc.asp が異常実行;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY かつ 1=1、abc.asp は正常に実行され、実行結果は HTTP://xxx.xxx.xxx/abc.asp と同じになります。 ?p=YY 同じ;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY および 1=2、abc.asp が異常に実行されています;
上記の 3 つの手順が完全に満たされている場合は、abc.asp に SQL インジェクションの脆弱性が存在するはずです。
関数 num_check($id) {
If (! $id) {
die (「パラメーターを空にすることはできません!」 );
} //空かどうかを判断する
else if (inject_check ( $id )) {
die (「不正なパラメータ」);
} //判定を注入する
else if (! is_numetic ( $id )) {
die (「不正なパラメータ」);
}
//数値判定
$id = 整数 ($id);
//整数化
$id を返します
}
//文字フィルター関数
関数 str_check($str) {
If (inject_check ( $str )) {
die (「不正なパラメータ」);
}
// 判定を注入する
$str = htmlspecialchars ($str);
//HTMLを変換する
$str を返します
}
関数 search_check($str) {
$str = str_replace ( "_", "_", $str );
//「_」をフィルターで除外します
$str = str_replace ( "%", "%", $str );
//「%」を除外します
$str = htmlspecialchars ($str);
//HTMLを変換する
$str を返します
}
//フォームフィルター関数
関数 post_check($str, $min, $max) {
If (isset ( $min ) && strlen ( $str )
die (「少なくとも $min バイト」);
} else if (isset ( $max ) && strlen ( $str ) > $max) {
die ('最大 $max バイト');
}
ストリップスラッシュ配列 ($str) を返します
;
}
入力パラメータ YY が文字列の場合、通常、abc.php 内の元の SQL ステートメントはおおよそ次のとおりです:
select * from table name where field='YY' なので、次の手順を使用して SQL インジェクションが存在するかどうかをテストできます。
①HTTP://xxx.xxx.xxx/abc.php?p=YY’ (一重引用符を追加)、このとき abc.ASP の SQL ステートメントは
になります。
select * from table name where field=YY’、abc.asp が異常実行;
②HTTP://xxx.xxx.xxx/abc.php?p=YY&;nb ... 39;1'='1'、abc.php は正常に実行され、HTTP://xxx.xxx.xxx と一貫性があります。 / abc.asp?p=YY の実行結果は同じです;
③HTTP://xxx.xxx.xxx/abc.php?p=YY&;nb ... 39;1'='2'、abc.php が異常に実行されています;
上記の 3 つの手順が完全に満たされている場合は、abc.asp に SQL インジェクションの脆弱性が存在するはずです。
//アンチインジェクション関数関数 inject_check($sql_str) {
return eregi ( 'select|inert|update|delete|'|/*|*|../|./|UNION|into|load_file|outfile', $sql_str ); // インジェクションを防ぐフィルター}
関数tripslashes_array(&$array) {If (is_array ( $array )) {
foreach ( $array as $k => $v ) {$array [$k] =tripslashes_array ( $v ); } else if (is_string ( $array )) {
$array = ストリップスラッシュ ( $array ); }$配列を返します
}
//php 投稿をバッチフィルターして機密データを取得します
if (get_magic_quotes_gpc()) {
$_GET = ストリップスラッシュ_配列($_GET);
$_POST = ストリップスラッシュ_配列($_POST);
}
関数tripslashes_array(&$array) {
while(list($key,$var) = each($array)) {
if ($key != 'argc' && $key != 'argv' && (strtoupper($key) != $key || ''.intval($key) == "$key")) {
if (is_string($var)) {
$array[$key] = ストリップスラッシュ($var);
}
if (is_array($var)) {
$array[$key] = ストリップスラッシュ_配列($var);
}
}
}
$array を返します;
}
//过滤
関数 htmlencode($str){
if(empty($str)) return;
if($str=="") $str;
を返す
$str=trim($str);
$str=str_replace("&","&",$str);
$str=str_replace(">",">",$str);
$str=str_replace("<","<",$str);
$str=str_replace(chr(32)," ",$str);
$str=str_replace(chr(9)," ",$str);
$str=str_replace(chr(9)," ",$str);
$str=str_replace(chr(34),"&",$str);
$str=str_replace(chr(39),"'",$str);
$str=str_replace(chr(13),"
",$str);
$str=str_replace("'","''",$str);
$str=str_replace("選択","選択",$str);
$str=str_replace("スクリプト","スクリプト",$str);
$str=str_replace("スクリプト","スクリプト",$str);
$str=str_replace("結合","結合",$str);
$str=str_replace("ユニオン","ユニオン",$str);
$str=str_replace("どこ","どこ",$str);
$str=str_replace("挿入","挿入",$str);
$str=str_replace("削除","削除",$str);
$str=str_replace("更新","更新",$str);
$str=str_replace("いいね","いいね",$str);
$str=str_replace("ドロップ","ドロップ",$str);
$str=str_replace("作成","作成",$str);
$str=str_replace("変更","変更",$str);
$str=str_replace("名前変更","名前変更",$str);
$str=str_replace("alter","alter",$str);
$str=str_replace("キャスト","cas",$str);
$str;
を返します
}
//解脱
関数 htmldecode($str){
if(empty($str)) return;
if($str=="") $str;
を返す
$str=str_replace("選択","選択",$str);
$str=str_replace("結合","結合",$str);
$str=str_replace("ユニオン","ユニオン",$str);
$str=str_replace("どこ","どこ",$str);
$str=str_replace("挿入","挿入",$str);
$str=str_replace("削除","削除",$str);
$str=str_replace("更新","更新",$str);
$str=str_replace("いいね","いいね",$str);
$str=str_replace("ドロップ","ドロップ",$str);
$str=str_replace("作成","作成",$str);
$str=str_replace("変更","変更",$str);
$str=str_replace("名前変更","名前変更",$str);
$str=str_replace("alter","alter",$str);
$str=str_replace("cas","cast",$str);
$str=str_replace("&","&",$str);
$str=str_replace(">",">",$str);
$str=str_replace("<","<",$str);
$str=str_replace(" ",chr(32),$str);
$str=str_replace(" ",chr(9),$str);
$str=str_replace(" ",chr(9),$str);
$str=str_replace("&",chr(34),$str);
$str=str_replace("'",chr(39),$str);
$str=str_replace("
",chr(13),$str);
$str=str_replace("''","'",$str);
$str;
を返します
}
// 関数: string_filter($string, $match_type=1)
// 機能: 違法なコンテンツをフィルタリングします
// パラメータ:
// $string チェックする文字列
// $match_type 一致タイプ、1 は完全一致、2 はあいまい一致、デフォルトは 1 です
//
//Return: 違法なコンテンツがある場合は True、違法なコンテンツがない場合は False
//その他: 不正なキーワードのリストは、通常の不正なキーワードと重大な不正なキーワードの 2 つのリストに分かれて txt ファイルに保存されます
// 作者: heyeluren
// 時刻: 2006-1-18
//
//=============================================== ======================
関数 lib_lawless_string_filter($string, $match_type=1)
{
//空の文字列を直接返すのは違法です
$string = トリム($string);
if (空($string))
{
false を返します;
}
//重要キーワードリストと共通キーワードリストを取得します
$common_file = "common_list.txt" //共通フィルターキーワードリスト
$signify_file = "signify_list.txt" //重要なフィルターキーワードリスト
;
// リスト ファイルが存在しない場合は、直接 false を返します。それ以外の場合は、2 つのファイル リストを 2 つの配列に読み取ります
if (!file_exists($common_file) || !file_exists($signify_file))
{
false を返します;
}
$common_list = ファイル($common_file);
$signify_list = ファイル($signify_file);
//完全一致
if ($match_type == 1)
{
$is_lawless = strict_match($string, $common_list);
}
//ファジーマッチング
if ($match_type == 2)
{
$is_lawless = Blur_match($string, $common_list, $signify_list);
}
//検索結果の配列にデータが存在するかどうかを判定し、存在する場合は不正であることが判明します
。
if (is_array($is_lawless) && !empty($is_lawless))
{
true を返します;
}
それ以外
{
false を返します;
}
}
//---------------------
// 完全一致、フィルタリングを提供
//-------------------------------------
関数exact_match($string, $common_list)
{
$string = トリム($string);
$string = lib_replace_end_tag($string);
//共通フィルターキーワードリストを取得します
foreach($common_list as $block)
{
$block = トリム($block);
if (preg_match("/^$string$/i", $block))
{
$blist[] = $block;
}
}
//配列内にフィルタリングされたコンテンツがあるかどうかを判断します
if (!empty($blist))
{
return array_unique($blist);
}
false を返す;
}
//----------------------
// ファジーマッチング、フィルタリングを提供
//---------------------
関数blur_match($string, $common_list, $signify_list)
{
$string = トリム($string);
$s_len = strlen($string);
$string = lib_replace_end_tag($string);
//共通フィルターキーワードリストを取得します
foreach($common_list as $block)
{
$block = トリム($block);
if (preg_match("/^$string$/i", $block))
{
$blist[] = $block;
}
}
//厳しいフィルターのキーワードリストを取得します
foreach($signify_list as $block)
{
$block = トリム($block);
if ($s_len>=strlen($block) && preg_match("/$block/i", $string))
{
$blist[] = $block;
}
}
//配列内にフィルタリングされたコンテンツがあるかどうかを判断します
if (!empty($blist))
{
return array_unique($blist);
}
false を返す;
}
//---------------------------
// フィルタリング サービス用に HTML尾のタグ付けを置き換えます
//-------------------------------------
関数 lib_replace_end_tag($str)
{
if (empty($str)) return false;
$str = htmlspecialchars($str);
$str = str_replace( '/', "", $str);
$str = str_replace("", "", $str);
$str = str_replace(">", "", $str);
$str = str_replace("<", "", $str);
$str = str_replace("<SCRIPT>", "", $str);<br>
$str = str_replace("</SCRIPT>", "", $str);
$str = str_replace("<script>", "", $str);<br>
$str = str_replace("</script>", "", $str);
$str=str_replace("選択","選択",$str);
$str=str_replace("結合","結合",$str);
$str=str_replace("ユニオン","ユニオン",$str);
$str=str_replace("どこ","どこ",$str);
$str=str_replace("挿入","挿入",$str);
$str=str_replace("削除","削除",$str);
$str=str_replace("更新","更新",$str);
$str=str_replace("いいね","いいね",$str);
$str=str_replace("ドロップ","ドロップ",$str);
$str=str_replace("作成","作成",$str);
$str=str_replace("変更","変更",$str);
$str=str_replace("名前変更","名前変更",$str);
$str=str_replace("alter","alter",$str);
$str=str_replace("cas","cast",$str);
$str=str_replace("&","&",$str);
$str=str_replace(">",">",$str);
$str=str_replace("<","<",$str);
$str=str_replace(" ",chr(32),$str);
$str=str_replace(" ",chr(9),$str);
$str=str_replace(" ",chr(9),$str);
$str=str_replace("&",chr(34),$str);
$str=str_replace("'",chr(39),$str);
$str=str_replace("
",chr(13),$str);
$str=str_replace("''","'",$str);
$str=str_replace("css","'",$str);
$str=str_replace("CSS","'",$str);
$str;を返す
//HTMLタグ付け、拡張子フィルターとして使用可能
/*
$tags = array("/html", "/head", "/body", "/div", "/span", "/DOCTYPE", "/title", "/link", "/meta", "/style"、"/p"、"/h1"、"/h2"、"/h3"、"/h4"、"/h5"、"/h6"、"/strong"、"/em"、 "/abbr"、"/acronym"、"/address"、"/bdo"、"/blockquote"、"/cite"、"/q"、"/code"、"/ins"、"/del"、 「/dfn」、「/kbd」、「/pre」、「/samp」、「/var」、「/br」、「/a」、「/img」、「/area」、「/map」、 "/object"、"/param"、"/ul"、"/ol"、"/li"、"/dl"、"/dt"、"/dd"、"/table"、"/tr"、 "/td"、"/th"、"/tbody"、"/thead"、"/tfoot"、"/col"、"/colgroup"、"/caption"、"/form"、"/input"、 "/textarea"、"/select"、"/option"、"/optgroup"、"/button"、"/label"、"/fieldset"、"/legend"、"/script"、"/noscript"、 "/b"、"/i"、"/tt"、"/sub"、"/sup"、"/big"、"/small"、"/hr" );
*/
}
引用は直接次のようになります:
$xxx = htmlspecialchars($_POST['xxx']);
または
$xxx = htmlspecialchars($_GET['xxx']);