You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python调用带身份验证的PHP脚本安全更新数据库?

Solution to Secure Your PHP Script Trigger & Prevent Duplicate Updates

Great question—let's fix that security gap and add proper authentication to your workflow, while also stopping those unwanted duplicate database updates. Here's a step-by-step breakdown using modern Python tools and PHP validation:

1. Use Python's requests Library (Far Simpler Than urllib2)

While urllib2 can handle this, the requests library is the de facto standard for HTTP requests in Python—it's more intuitive and cleaner for sending JSON payloads.

Step 1: Install requests (if you haven't already)

pip install requests

Step 2: Python Script to Send Authenticated Request

Modify your existing Python code to include a JSON payload with credentials when triggering the PHP script. Never hardcode credentials—store them in environment variables or a secure config file instead.

import requests
import json

# Load credentials securely (example using environment vars)
auth_data = {
    "username": "your_admin_username",
    "password": "your_secure_password"
}

# URL of your PHP script
php_script_url = "https://your-domain.com/update-db.php"

try:
    # Send POST request with JSON authentication
    response = requests.post(
        php_script_url,
        json=auth_data,
        timeout=10
    )

    # Handle response
    if response.status_code == 200:
        print(f"Success: {response.json()['message']}")
    elif response.status_code == 401:
        print("Error: Invalid credentials")
    else:
        print(f"Request failed: {response.status_code} - {response.text}")
except requests.exceptions.RequestException as e:
    print(f"Connection error: {str(e)}")

Legacy Option: Using urllib2

If you must stick with urllib2 for compatibility reasons, here's how to send JSON credentials:

import urllib2
import json

auth_data = json.dumps({
    "username": "your_admin_username",
    "password": "your_secure_password"
})

headers = {"Content-Type": "application/json"}
request = urllib2.Request(php_script_url, auth_data, headers)

try:
    response = urllib2.urlopen(request, timeout=10)
    print("Success: Update triggered")
except urllib2.HTTPError as e:
    print(f"Error: {e.code} - {e.read()}")
except urllib2.URLError as e:
    print(f"Connection error: {str(e)}")

2. Modify Your PHP Script for Authentication & Duplicate Protection

Update your PHP script to first validate the incoming credentials, then check if the XML file has actually changed before running the database update.

PHP Script Example (update-db.php)

<?php
// 1. Validate request type and content
if ($_SERVER['REQUEST_METHOD'] !== 'POST' || $_SERVER['CONTENT_TYPE'] !== 'application/json') {
    http_response_code(400);
    echo json_encode(["error" => "Invalid request format"]);
    exit;
}

// 2. Parse JSON authentication payload
$payload = json_decode(file_get_contents('php://input'), true);

// 3. Validate credentials (store these securely, e.g., in environment vars)
$valid_username = "your_admin_username";
$valid_password = "your_secure_password";

if (!isset($payload['username'], $payload['password']) ||
    $payload['username'] !== $valid_username ||
    $payload['password'] !== $valid_password) {
    http_response_code(401);
    echo json_encode(["error" => "Unauthorized access"]);
    exit;
}

// 4. Prevent duplicate updates by checking XML modification time
$xml_file_path = "/path/to/your/ftp/uploaded/file.xml";
$current_xml_mod_time = filemtime($xml_file_path);

// Assume you have a metadata table to track last update time
$db = new PDO('mysql:host=your_db_host;dbname=your_db_name', 'db_user', 'db_pass');
$stmt = $db->prepare("SELECT last_xml_update FROM system_metadata LIMIT 1");
$stmt->execute();
$last_update_time = $stmt->fetchColumn();

if ($current_xml_mod_time <= $last_update_time) {
    http_response_code(200);
    echo json_encode(["message" => "No update needed—XML hasn't changed"]);
    exit;
}

// 5. Run your existing XML parsing & database update logic here...

// 6. Update the stored last modification time
$stmt = $db->prepare("UPDATE system_metadata SET last_xml_update = ?");
$stmt->execute([$current_xml_mod_time]);

http_response_code(200);
echo json_encode(["message" => "Database updated successfully"]);
?>

3. Critical Security Best Practices

  • Use HTTPS: Always send requests over HTTPS to encrypt credentials in transit—never use plain HTTP.
  • Secure Credential Storage: Store Python/PHP credentials in environment variables, a secure secrets manager, or non-public config files (never hardcode them).
  • Rate Limiting: Add rate limiting to your PHP script (via .htaccess or PHP code) to block brute-force attacks on your authentication endpoint.
  • XML Validation: Even after authentication, validate the XML content to prevent injection attacks when parsing it for the database.

内容的提问来源于stack exchange,提问作者K.R.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:28:51