2011-03-04 9 views
6

में MySQL पूर्ण टेक्स्ट खोज के मिलान किए गए संदर्भ को पुनर्प्राप्त करना मैं अपनी MySQL तालिका "पृष्ठों" पर एक पूर्ण टेक्स्ट खोज कर रहा हूं। मैं उन पृष्ठों की एक सूची प्रदर्शित कर रहा हूं जो कीवर्ड को उनके "शीर्षक" (सादा पाठ, वचरर, 255) या "सामग्री" (एचटीएमएल, टेक्स्ट) में मेल खाते हैं। जब मैच "सामग्री" फ़ील्ड में मिलता है, तो मैं स्निपेट प्रदर्शित करना चाहता हूं जिसमें मैच मिला था। मुझे नहीं पता कि इस बारे में कैसे जाना है।PHP (और सुरक्षा)

क्या आप मुझे सही दिशा में डाल सकते हैं?

$query = ' SELECT 
       *, 
       MATCH(title, content) AGAINST("'.$keyword.'") AS score 
      FROM 
       page 
      WHERE 
       MATCH(title, content) AGAINST("'.$keyword.'") 
      ORDER BY 
       score 
      DESC '; 
$result = mysql_query($query) or die (mysql_error()); 
if(mysql_num_rows($result) > 0) { 
    $output .= '<p>Your keyword matches the following pages:</p>'; 
    while($row = mysql_fetch_assoc($result)){ 

     $title  = htmlentities($row['title']); 
     $content = htmlentities(strip_tags($row['content'])); 
     $content = limit_text($content, 250); // Cuts it down to 250 characters plus ... 

     $output .= '<h2>'.$title.'</h2>'; 
     if(trim($content) != '') { 
      $output .= '<p>'.$content.'</p>'; // I'd like to place a snippet here with the matched context 
     }   
    } 
} else { 
    $output .= '<p>Keyword not found...</p>';  
} 

इसके अलावा, मेरे पास सुरक्षा के बारे में कोई सवाल है। अभी मैं $keyword को तीन तरीकों से देख रहा हूं:

  • खाली नहीं है?
  • 2 से अधिक वर्ण?
  • खतरनाक नहीं है? (देखें नीचे)

मैं रेगुलर एक्सप्रेशन का उपयोग, निम्नलिखित मैच के लिए देखने के लिए कि उपयोगकर्ता इनपुट खतरनाक है

<script|&lt;script|&gt;script|document.|alert|bcc:|cc:|x-mailer:|to:|recipient|truncate|drop table 

इस को हल करने के लिए एक छोटा सा हास्यास्पद और आसान हो सकता है, लेकिन यह एक्सएसएस शोषण के खिलाफ कम से कम सुरक्षा का न्यूनतम रूप है। खोज के उद्देश्य से लक्षित कीवर्ड को सुरक्षित करने का अनुशंसित तरीका क्या है? PHPIDS ओवरकिल है?

+0

अपने प्रश्न के सुरक्षा हिस्से के जवाब में, [पीडीओ] (http://php.net/manual/en/ref.pdo-mysql.php) का उपयोग करें यदि आप कर सकते हैं। अन्यथा आपको 'mysql_real_escape_string()' के माध्यम से कम से कम '$ कीवर्ड' चलाएं। – glomad

+0

आपकी एक्सएसएस सुरक्षा कमजोर है। यह भी कहना सुरक्षित है कि 'ड्रॉप टेबल' ** इस कोड पर हमला नहीं कर सकता है क्योंकि 'mysql_query() 'क्वेरी स्टैकिंग की अनुमति नहीं देता है। – rook

+0

@itchy धन्यवाद, मैं 'पीडीओ 'की जांच करूंगा, लेकिन अभी के लिए मैं सिर्फ' mysql_real_escape_string() 'का उपयोग करूंगा, धन्यवाद। @Rook, आपकी अंतर्दृष्टि के लिए धन्यवाद, मुझे यह एहसास है, यही कारण है कि मैं एक विकल्प की तलाश में हूं। – maartenmachiels

उत्तर

6

यह आपको "संदर्भ" "भाग ...

// return the part of the content where the keyword was matched 
function get_surrounding_text($keyword, $content, $padding) 
{ 
    $position = strpos($content, $keyword); 
    // starting at (where keyword was found - padding), retrieve 
    // (padding + keyword length + padding) characters from the content 
    $snippet = substr($content, $position - $padding, (strlen($keyword) + $padding * 2)); 
    return '...' . $snippet . '...'; 
} 

$content = 'this is a really long string of characters with a magic word buried somewhere in it'; 
$keyword = 'magic'; 
echo get_surrounding_text($keyword, $content, 15); // echoes '... string with a magic word in it...' 

इस समारोह मामलों में जहां गद्दी सीमाओं सामग्री स्ट्रिंग के बाहर जाना होगा, जब कीवर्ड शुरुआत या सामग्री के अंत के पास पाया जाता है की तरह के लिए खाते में नहीं है। यह कई मैचों आदि के लिए भी जिम्मेदार नहीं है, लेकिन उम्मीद है कि कम से कम आपको सही दिशा में इंगित करें।

2

बजाय फिल्टर करने के लिए $keywords चर खुद के प्रयास करते हैं, तो आप बस इस्तेमाल कर सकते हैं एक prepared statement और कभी नहीं एक संभावित लापता के बारे में चिंता का फायदा उठाने:

<?php 
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
?> 
+0

इसके लिए धन्यवाद ... मुझे एक अच्छा ट्यूटोरियल मिला है http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/ जो मुझे प्राप्त करेगा पीडीओ पर शुरू किया। – maartenmachiels

0

मैं शायद एक समारोह के लिए $ कीवर्ड मिलेगा पहले उसे साफ यदि मैं तुम्हारी जगह होता। और रिकॉर्ड के लिए आप सभी शब्दों को $ कीवर्ड में सरणी में बेहतर तरीके से डाल देंगे ताकि यदि आवश्यक हो तो आप boolean search का उपयोग कर सकते हैं। (जैसे + शब्द प्राप्त करने और प्रभाव के लिए प्रत्येक शब्द के सामने)

संबंधित मुद्दे