2

自分の URL を適切に検証することについて、非常に混乱しています。いくつかのオプションを試しましたが、うまくいきません。誰かが私のコードを見て、私が間違っていることを教えてもらえますか?

$url=filter_input(INPUT_GET, 'url', FILTER_VALIDATE_URL); 
if (!$url) {
    echo The url address is not valid
}

if(strpos($url,'http://')===false)
    $url='http://'.$url;
$query="INSERT INTO `aa_aa`.`article` VALUES ('', '".$url."', '".$_POST['description']."', '".$_POST['type']."',NOW());";
$result=mysql_query($query);
if(!$result)
    // echo 'Error While Inserting Article!';
    echo $query;
else
    header('Location: http://aa.aa');

編集 申し訳ありませんがエリックです。@Brad友人がすべてのスクリプトを手伝ってくれたので、これを使用するリスクがよくわかりません。

 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
 SET time_zone = "+00:00";


 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
 /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
 /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
 /*!40101 SET NAMES utf8 */;

 --
 -- Database: 
 --

 -- --------------------------------------------------------


 -- Table structure for table `article`
 --

 CREATE TABLE IF NOT EXISTS `article` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `url` varchar(100) NOT NULL,
   `description` text NOT NULL,
   `type` varchar(40) NOT NULL,
   `title` varchar(80) NOT NULL,
   `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY (`id`),
   UNIQUE KEY `id` (`id`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=137 ;

 /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
 /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
4

2 に答える 2

1

いくつかのこと:

$url=filter_input(INPUT_GET, 'url', FILTER_VALIDATE_URL); 

これは素晴らしいです。を使用するfilter_input()のがベスト プラクティスです。

if (!$url) {
    echo The url address is not valid
}

このビットにはいくつかの問題があります。

  1. チェックされる値がブール値であることが保証されていない限り、 valueを具体的にチェックするときの$foo === FALSE代わりにを使用する習慣を身につけてください。この特定のケースでは、 boolean に強制できる有効な URL はないと思いますので、おそらく安全ですが、習慣を身につけるのは良いことです。!$fooFALSEFALSE
  2. エコーしている文字列には引用符と末尾のセミコロンがないため、構文エラーが発生します。
  3. スクリプトの続行を妨げるものは何もありません。これは、無効な URL がまだデータベースに侵入していることを意味します。exit;の後に使用するかecho、ロジックを再構築して、エラー状態が実際に無効な URL の追加とスクリプトの継続を防ぐようにする必要があります。

    if(strpos($url,'http://')===false) $url='http://'.$url;

ここにもいくつかのことがあります:

  1. {}コード ブロックを常に中かっこで囲みます。
  2. FILTER_VALIDATE_URLスキームを持たない URL は検証されません。つまり、このコードは冗長であり、削除する必要があります。これは、filter_input()呼び出しを通過するすべての URL がスキーム (例: http://) を持つことが保証されているためです。
  3. をチェックするだけではhttp://https://. ただし、これは大したことではありません。なぜなら、上で指摘したように、このコード ブロックはとにかく削除する必要があるからFILTER_VALIDATE_URLです。

    $query="INSERT INTO aa_aa. articleVALUES ('', '".$url."', '".$_POST['description']."', '".$_POST['type']."',NOW ());";

これは、SQL インジェクションに対して広く開かれています。ユーザー入力をクエリ文字列に直接埋め込まないでください。可能な限り、パラメーター バインディングと準備済みステートメントを使用します。拡張機能を使用しているためMysql、これは不可能であり、最良の代替手段は を使用することmysql_real_escape_string()です。

$result=mysql_query($query);

Mysql拡張機能は非推奨です。代わりにPDOorを使用する必要があります。Mysqli

if(!$result)
    // echo 'Error While Inserting Article!';
    echo $query;
else
    header('Location: http://aa.aa');

{}繰り返しますが、常にコード ブロックを中括弧で囲んでください。

于 2012-09-25T03:18:17.607 に答える
0

これが正確にエラーかどうかはわかりませんが、テーブルレイアウトに基づいて、SQLクエリを変更する必要があります

"INSERT INTO `aa_aa`.`article` VALUES ('', '".$url."', '".$_POST['description']."', '".$_POST['type']."',NOW());"

"INSERT INTO aa_aa.article 
  (url,description,type,title,time) 
VALUES 
  ('". mysql_real_escape_string($url). "', 
   '". mysql_real_escape_string($_POST['description']). "', 
   '". mysql_real_escape_string($_POST['type']). "', 
   '". mysql_real_escape_string($_POST['title']). "',
   NOW())"

$_POST['title']元のクエリにはありませんでしたが、テーブル作成スクリプトに存在するため、作成したことに注意してください。mysql_real_escape_stringまた、ある程度のセキュリティを確保するには、実際に使用する必要があります。理想的には、PDO を使用する必要があります。

于 2012-09-25T00:32:04.223 に答える